Está en la página 1de 6

Ingeniera Tcnica Industrial

Fundamentos de Informtica


Tema 6. Punteros

Pgina 1 de 6

TEMA 6. PUNTEROS
Es una variable esttica que, en vez de contener valores de datos,
contiene valores que representan direcciones de memoria de variables.













D104 35
Vble puntero, x Vble entera, y
Pos: D217 Pos: D104
Memoria Principal
35
D104


y
x
D104
D217
Direccin en
Memoria de la
variable puntero x.
Contenido de la
variable puntero x
Direccin en Memoria de la variable
entera y (variable apuntada por x)
Contenido de la
variable entera y
(variable apuntada
por x)

PUNTERO Variable que contiene la DIRECCIN de memoria en la
que se encuentra almacenada otra variable.
La sintaxis general para declarar una variable tipo puntero es:
t i po *nombr e_punt er o;
donde tipo es el tipo de variables a la que apuntar el puntero.
i nt *p;

6.1 Los operadores punteros
Existen dos operadores especiales de punteros: * y &.
El operador & (operador direccin), aplicado sobre el nombre de
una variable, devuelve su direccin de memoria.
El operador * (operador indireccin) aplicado sobre una variable de
tipo puntero permite acceder al dato al que apunta, es decir, al
valor de la variable situada en esa direccin de memoria.
Ingeniera Tcnica Industrial
Fundamentos de Informtica


Tema 6. Punteros

Pgina 2 de 6

Ejemplo1:
i nt *p, b, x = 1250;
p = &x;
b = *p; / * b = x; */
Nombre de la
variable
Direccin de
memoria
Variable en
memoria
0x10004
b
0x10005
1250
0x10006
x
0x10007
1250
0x10008
0x10009
p
0x1000A
0x10006
0x1000B
Ejemplo2:
int cuent a = 125;
int *p;
int x;


p = &cuenta;



x = *p;














* p
Memoria Principal
125


c
u
e
n
t
a

p
D100
D150
x D175
Memoria Principal
125
D100


c
u
e
n
t
a

p
D100
D150
x D175
Memoria Principal
125
D100


c
u
e
n
t
a

p
D100
D150
125
x D175
Ingeniera Tcnica Industrial
Fundamentos de Informtica


Tema 6. Punteros

Pgina 3 de 6

6.2 Asignacin de punteros.
Respecto a la comparacin y a la asignacin, los punteros se ajustan
a las mismas reglas que cualquier otra variable en C:
Un puntero puede utilizarse a la derecha de una declaracin de
asignacin para asignar su valor a otro puntero.
Podemos comparar dos punteros en una expresin relacional.
#i ncl ude <st di o. h>
mai n( ) {
i nt i =100, *p1, *p2;
p1 = &i ;
p2 = p1;
i f ( p1==p2) / * est amos compar ando dos punt er os */
pr i nt f ( p1 apunt a a l a mi sma di r ecci n de memor i a que p2) ;
*p1 = *p1 + 2; / * El * t i ene ms pr i or i dad que el + */
pr i nt f ( El val or de *p2 es %d\ n, *p2) ;
( *p2) ++; / * ant e l a duda de pr i or i dades usamos par ent esi s */
pr i nt f ( El val or de *p1 es %d\ n, *p1) ;
i - - ;
pr i nf t ( El val or de i es %d\ n, i ) ;
}
A un puntero se le puede asignar:
El valor de otro puntero, del mismo tipo.
La direccin de memoria de una variable cuyo tipo coincida
en el tipo_base del puntero.
Ejemplo:
int x=15, *p1=NULL, *p2=NULL;
p1 = &x; / / Se l e asi gna l a di r ecci n de memor i a de x
p2 = p1; / / Se l e asi gna el val or de p1
Los dos apuntan a la misma variable
Ingeniera Tcnica Industrial
Fundamentos de Informtica


Tema 6. Punteros

Pgina 4 de 6

6.3 Inicializacin de punteros
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 apuntara a cualquier sitio (PELIGROSO) al usarlo
puede p.ej. modificar una parte de la memoria reservada a otra variable
Si an no sabemos dnde debe apuntar, se le asignar el valor NULL
(nulo) No apunta a ningn 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 bi nar i o es 11111111 ( 8 bi t s) */
char *p; / * p es un punt er o a un si gned char ( por def ect o) */
p = &a; / * al maceno en p l a di r de memor i a de l a var i abl e a */
printf("%i", *p); / * muest r a el val or 1, en vez de 255! */
}

main() {
unsigned int a=269, b; / * 269 en bi nar i o: 100001101 ( 9 bi t s) */
unsigned char *p; / * p: punt er o a unsi gned char ( 8 bi t s) */
p = &a; / * p supone que a es unsi gned char sol o coge 8 bi t s */
b = *p; / * asi gno a b el val or que hay en l a di r apunt ada por p */
printf("%i", b); / * muest r a el val or 13, en vez de 269! */
} / * coge sol o l os 8 1 bi t s ( 00001101) , cuyo val or es es 13 */
Ingeniera Tcnica Industrial
Fundamentos de Informtica


Tema 6. Punteros

Pgina 5 de 6

6.4 Problemas con los punteros
Un puntero con un valor errneo es MUY PELIGROSO, y el ERROR
ms DIFCIL DE DEPURAR, porque en compilacin NO SE DETECTA, y
los errores tras ejecutar pueden DESPISTAR.

Hay que hacer caso a los AVISOS (WARNINGS) ya que una sospecha
sobre un PUNTERO puede provocar un gravsimo error en ejecucin.

6.4.1 Ejemplo de puntero que no apunta al tipo correcto:
El tipo base del puntero determina el tipo de datos al que apunta el
puntero y por tanto es el que le indica al compilador cuantos bytes debe
transferir para cualquier asignacin que usa un puntero. Como podemos
asignar cualquier direccin a un puntero, no se produce error cuando
asignamos a un puntero, la direccin de una variable de un tipo distinto.
#i ncl ude <st di o. h>
mai n( ) {
f l oat x = 55. 4;
i nt *p; / * p es un punt er o a un ent er o */
p = &x; Error: cannot convert float* to int* in assignment
pr i nt f ( "El val or cor r ect o es: %f \ n", x) ;
pr i nt f ( "Val or apunt ado ( como f l oat ) : %f \ n", *p) ;
pr i nt f ( "Val or apunt ado ( como i nt ) : %i \ n", *p) ;
}
El error es debido a que p es un puntero a int y hacemos que apunte
a un float.
El val or cor r ect o es: 55. 400000
Val or apunt ado ( como f l oat ) : 508524232706. 400024
Val or apunt ado ( como i nt ) : - 26214
Ingeniera Tcnica Industrial
Fundamentos de Informtica


Tema 6. Punteros

Pgina 6 de 6

6.4.2 Ejemplo de puntero no inicializado
mai n( ) {
i nt i , *p;
i = 50;
*p = i ; / * ERROR! A dnde apunt a el punt er o p? */
pr i nt f ( El val or de i es %i \ n, i ) ;
pr i nt f ( El val or de *p es %i \ n, *p) ;
}
Ponemos el valor de i (50) en la dir de memoria a la que apunta p,
pero a dnde apunta p?. Si p apunta a una zona libre no hay problema,
pero si es a una zona donde hay datos entonces habr problemas.
Lo peor en este caso es que el compilador no muestra ningn
mensaje de error o de aviso.

6.4.3 Ejemplo de puntero usado de forma incorrecta
Este error suele ocurrir cuando olvidamos poner el operador de
direccin (&). Por ejemplo, consideremos el siguiente programa:
#i ncl ude <st di o. h>
mai n( ) {
i nt i , *p;
i = 50;
p = i ; Error: invalid conversion from int to int*
pr i nt f ( El val or de i es %i \ n, i ) ;
pr i nt f ( El val or de *p es %i \ n, *p) ;
}
Lo correcto sera haber escrito
p = &i ;
El error es debido a que hacemos que p apunte a la dir 50 de
memoria, en vez de a la dir de memoria donde se encuentra la variable i.
El val or de i es 50
El val or de *p es 50
El val or de i es 50
El val or de *p es - 3578

También podría gustarte