Punteros
TEMA 6. PUNTEROS
Es una variable estática que, en vez de contener valores de datos, contiene valores que representan direcciones de memoria de variables.
Memoria Principal Vble puntero, x Vble entera, y
D104 Pos: D217
35 Pos: D104
y
… 35 …
D104
x
Contenido de la variable puntero x Dirección enMemoria de la variable puntero x. Contenido de la variable entera y (variable apuntada por x)
D104 …
D217
Dirección en Memoria de la variable entera y (variable apuntada por x)
PUNTERO Variable que contiene la DIRECCIÓN de memoria en la que se encuentra almacenada otra variable. La sintaxis general para declarar una variable tipo puntero es:
tipo *nombre_puntero;
donde tipo es el tipo devariables a la que apuntará el puntero.
int *p;
6.1 Los operadores punteros Existen dos operadores especiales de punteros: * y &. • El operador & (operador dirección), aplicado sobre el nombre de una variable, devuelve su dirección de memoria. • El operador * (operador indirección) aplicado sobre una variable de tipo puntero permite acceder al dato al que apunta, es decir, al valor de lavariable situada en esa dirección de memoria.
Página 1 de 6
Ingeniería Técnica Industrial Fundamentos de Informática Tema 6. Punteros
Ejemplo1:
int *p, b, x = 1250; p = &x; b = *p; /* b = x; */ Nombre de la variable b x Dirección de memoria 0x10004 0x10005 0x10006 0x10007 0x10008 0x10009 0x1000A 0x1000B Variable en memoria 1250 1250 *p 0x10006
p
Ejemplo2:
int cuenta = 125; int *p; intx;
Memoria Principal
p = &cuenta;
x = *p;
Memoria Principal
Memoria Principal
…
…
cuenta
cuenta
125 …
D100
125 …
D100
cuenta
125 …
…
D100
p …
D150
p
D100 …
D150
p
D100 …
D150
x …
D175
x …
D175
x
125 …
D175
Página 2 de 6
Ingeniería Técnica Industrial Fundamentos de Informática Tema 6. Punteros6.2 Asignación de punteros. Respecto a la comparación y a la asignación, los punteros se ajustan a las mismas reglas que cualquier otra variable en C: • Un puntero puede utilizarse a la derecha de una declaración de asignación para asignar su valor a otro puntero. • Podemos comparar dos punteros en una expresión relacional.
#include main() { int i=100, *p1, *p2; p1 = &i; p2 = p1; if (p1==p2) /*estamos comparando dos punteros */ printf(“p1 apunta a la misma dirección de memoria que p2”); *p1 = *p1 + 2; /* El * tiene más prioridad que el + */ printf (“El valor de *p2 es %d\n”, *p2); (*p2)++; /* ante la duda de prioridades usamos parentesis */ printf(“El valor de *p1 es %d\n”, *p1”); i--; prinft(“El valor de i es %d\n”, i); }
A un puntero se le puede asignar: El valor de otro puntero, delmismo tipo. La dirección de memoria de una variable cuyo tipo coincida en el tipo_base del puntero. Ejemplo: int x=15, p1 = &x; p2 = p1;
*p1=NULL, *p2=NULL;
// Se le asigna la dirección de memoria de // Se le asigna el valor de
x
p1
Los dos apuntan a la misma variable
Página 3 de 6
Ingeniería Técnica Industrial Fundamentos de Informática Tema 6. Punteros
6.3 Inicialización depunteros Al igual que otras variables, C no inicializa los punteros cuando se declaran y es preciso inicializarlos antes de su uso. TODO PUNTERO DEBE INICIALIZARSE, ya que en caso contrario tras ser declarado apuntaría a cualquier sitio (PELIGROSO) al usarlo puede p.ej. modificar una parte de la memoria reservada a otra variable Si aún no sabemos dónde debe apuntar, se le asignará el valor NULL(nulo) No apunta a ningún sitio en especial. Ejemplo: int *p = NULL;
Las variables tipo puntero deben apuntar al tipo de dato correcto. Si no es así, pueden producirse resultados inesperados. Por ejemplo:
main() { unsigned char a=255; /* 255 en binario es 11111111 (8 bits) */ char *p; /* p es un puntero a un signed char (por defecto) */ /* ¡muestra el valor –1, en vez de 255! */ p = &a; /*...
Regístrate para leer el documento completo.