Punteros pointers en C

– Prog099

/* Prog099.cpp */

#include <stdio.h>
void main()
{
int *pint;
int *pint2;
printf(«n Dirección de memoria de pint: %p n»,pint); printf(«n Dirección de memoria de pint2: %p n»,pint2);
*pint=10;
*pint2=25;
printf(«n Valor de pint: %d n»,*pint); printf(«n Valor de pint2: %d n»,*pint2);
pint2=pint;
printf(«n Atención acabo de igualar los dos punteros n»);
printf(«n Dirección de memoria de pint: %p n»,pint);
printf(«n Dirección de memoria de pint2: %p n»,pint2);
printf(«n Valor de pint: %d n»,*pint); printf(«n Valor de pint2: %d n»,*pint2);
}

Estudio del PROG099:

– Un puntero (pointer) es una variable cuyo contenido no es un valor, sino una dirección de memoria.
– La forma de declarar un puntero es igual que para declarar una variable normal y corriente pero anteponiendo un asterisco.

De esta forma:

int *pint;
Int *pint2;

declaramos 2 punteros, es decir 2 direcciones de memoria que contendran datos enteros (int).

– printf(“n Dirección de memoria de pint: %p n”,pint); 
Debido a que pint es un puntero, en la instrucción anterior no hemos de anteponer &. Aunque sí utilizar el identificador de formato correspondiente (%p).

Está claro que:

int pepe;
printf(“n Dirección de memoria de pepe: %p n”, &pepe); sería equivalente.

– Para acceder al dato correspondiente a un puntero, hemos de anteponer un asterisco. De esta forma: *pint=10; sirve para asignar a la variable puntero (pint) el valor entero 10.

– Si observas detenidamente el resultado del programa PROG099, conseguimos “eliminar” la dirección de memoria de la variable pint2.

Vamos a intentar hacer un programa que haga lo mismo que el anterior, pero sin utilizar punteros.

– Prog100

/* Prog100.cpp */

#include <stdio.h>
void main()
{
int pint;
int pint2;
printf(«n Dirección de memoria de pint: %p n»,&pint);
printf(«n Dirección de memoria de pint2: %p n»,&pint2);
pint=10;
pint2=25;
printf(«n Valor de pint: %d n»,pint);
printf(«n Valor de pint2: %d n»,pint2);
pint2=pint;
printf(«n Atención acabo de igualar las dos variables n»);
printf(«n Dirección de memoria de pint: %p n»,&pint);
printf(«n Dirección de memoria de pint2: %p n»,&pint2);
printf(«n Valor de pint: %d n»,pint);
printf(«n Valor de pint2: %d n»,pint2);
}

Grábalo con el nombre PROG100

Ejecútalo varias veces y compáralo con el PROG099

Estudio del PROG100:

– Básicamente el PROG100 es equivalente al PROG099, pero con una diferencia fundamental: En el PROG099 igualamos el valor de dos variables, pero eliminando físicamente una dirección de memoria.
– En el PROG100 igualamos 2 variables pero continuamos con dos variables de memoria.
– Podríamos concluir: “el uso de punteros permite ahorrar memoria”. Próximamente veremos que el uso de punteros (característico del lenguaje C), sirve para bastantes más cosas.
– Al escribir: int peps; el compilador reserva una posición de memoria para albergar la dirección de una variable “int” y de nombre “*peps”. Es decir: “peps” guardará la dirección de memoria de la variable entera “*peps”, se dice que “peps” apunta a la variable entera “*peps”.

x Al escribir:
int variab,*pint;
pint=&variab;

diremos que “pint” apunta a la variable “variab”.
Ante la orden “int variab” el compilador “reserva” un grupo de bits (los correspondientes a un número entero), podríamos definir una variable como un conjunto de bits. Encambio “pint” es una dirección de memoria, en nuestro ejemplo: la dirección de memoria de la variable “variab” (pint=&variab).

– Si consideras el siguiente programa:

/* Prog100b.cpp */
#include <stdio.h>
void main()

{
char var1;
char *pchar;
pchar=&var1;

for (var1=’a’;var1<=’z’;var1++) printf(“%c”,*pchar);
}

Evidentemente seria equivalente en lugar de “printf(“%c”,*pchar)” escribir“printf(“%c”,var1)”

Observa que en la línea: pchar=&var1 inicializamos el puntero (asignamos apchar la dirección de var1) y automáticamente inicializamos “*pchar” (asignamos a “*pchar” la variable “var1”), aunque el valor de var1 no lo asignamos hasta for(var1=’a’; …)

Fuente: Programación en C/C++ (Manual FV) de Fermí Vilà