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à