2. Conceptos de Punteros
es una variable que representa la posición (en vez
del valor) de otro dato, tal como una variable o un
elemento de un array.
proporcionan una forma de devolver varios datos
desde una función a través de los argumentos de la
función.
pasar funciones como argumentos de una función
dada.
3. El dato representado por v (es decir, el dato
almacenado en las celdas de memoria de v) puede
ser accedido mediante la expresión *pv. Por tanto,
*pv y v representan el mismo dato. Si escribimos
pv = &v y u = *pv, entonces u y v representan el
mismo valor.
4. DECLARACION DE
PUNTEROS
Un tipo de dato
El puntero solo podrá almacenar direcciones de
memoria de variables del tipo especificado
Se pueden definir punteros de cualquier tipo:
float *pf;
char *pc;
Un identificador que siempre va antecedido del operador *
pt almacena la
dirección de x, se dice
que pt apunta a x
x
pt
int *p;
1000
1001
1002
1003
1004
1005 1000
int *pt, x;
x = 3;
pt = &x;
3
5. Relación entre dos variables enteras, sus correspondientes
direcciones y sus punteros asociados.
#include <stdio.h>
main ( ) {
SALIDA
int u=3;
U = 3 &u = 22ff44 pu = 22ff44 *pu = 3
int v;
V = 3 &v = 22ff40 pv = 3 *pv = 3
int *pu; /*puntero a un entero*/
int *pv; /*puntero a un entero*/
pu = &u; /*Asigna dirección de u a pu*/
v = *pu; /*Asigna el valor de u a v*/
pv = &v /*Asig. Direc. de v a pv*/
printf ("n u = %d &u =%x pu =%x *pu = %d", u, &u, pu, *pu);
printf("nn v = %d &v = %x pv = %x *pv = %d", v &v, pv, *pv);
}
6. CONSULTANDO CONTENIDO
Si un puntero apunta a una variable
A través del puntero se puede llegar a conocer todo sobre la variable
Ejemplo:
c = ‘A’
printf(“%c”, *pc1);
*pc1 = ‘N’
printf(“%c”,c);
Es equivalente a :
printf(“%c”, c);
Es equivalente a :
c = ‘N’
Imprime ‘N’ pues c ya
cambio
char c, *pc1, *pc2;
pc1 = &c;
Si quiero conocer la dirección, uso directamente el puntero
printf(“%d”, pc1); //Imprimo la dir. Almacenada por pc1
pc2 = pc1; //pc2 almacena la misma dir. que pc1
Si quiero conocer el contenido al que apunta un puntero, uso el
operador *, sobre dicho puntero
7. EJERCICIO EN CLASE
int x,y;
int *p1,*p2;
x = -42;
y = 163;
p1 = &x;
p2 = &y;
*p1 = 17;
*p2 = x+5;
*p1 = *p2;
163
1004
1000
1004
1004
Es equivalente a escribir
x = y;
p1 = p2; Esto indica que p1
ahora apunta a la
misma variable que p2
p1 = NULL;
p2 = NULL; Esto es equivalente a “encerar” el
puntero, y decir que no apunta a ninguna
variable
1000
1004
1008
1012
x
y
p1
p2
-1272
42
22
1000
0
1004
0
8. ARITMETICA DE PUNTEROS
Los operadores + y –
Se pueden usar con punteros
Pero el significado de la operación cambia un poco
Si un entero ocupa 4 bytes, tomemos este ejemplo
int x;
int *p;
p = &x;
La suma indica que p se mueva 2
“enteros” mas adelante
Cada entero equivale a 4 bytes
100 + 2*4 = 108
Si la dirección de x es un valor 100 y decimos
p = p+2;
Que dirección almacena pi?
102 108 104
9. EJERCICIO EN CLASE
main(){
double Lista[3];
double *p,*p1,*p2;
int k;
Lista[0] = 1;
Lista[1] = 1.1;
Lista[2] = 1.2;
p = Lista;
p = p + 2;
printf(“%d”, *p);
p = p - 1;
printf(“%d”, *p);
p1 = Lista+2;
p2 = &Lista[0];
k = p1-p2;
printf(“%d”, k);
}
1000
1008
1016
Lista[0]
Lista[1]
Lista[2]
p
p2
p se mueve 2 p1
desfases
p retrocede un
desfase
Da el total de desfases
entre p1 y p2
1
1.1
1.2