punteros. 1 intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */...
TRANSCRIPT
Punteros
1
Intercambio con error ¿porqué?
#include <stdio.h>void intercambio(int, int); /* prototipo */main(){
int a=1,b=2; printf("a=%d b=%d\n",a,b);
intercambio(a,b); /* llamada */ printf("a=%d b=%d\n",a,b);
return 0;}void intercambio(int x, int y){ /* declaración formal */int temp;temp=x; x=y; y=temp; printf(“ x=%d y=%d\n“,x,y);}
1
Intercambio con error ¿porqué?
#include <stdio.h>void intercambio(int, int); /* prototipo */main(){
int a=1,b=2; printf("a=%d b=%d\n",a,b);
intercambio(a,b); /* llamada */ printf("a=%d b=%d\n",a,b);
return 0;}void intercambio(int x, int y){ /* declaración formal */int temp;temp=x; x=y; y=temp; printf(“ x=%d y=%d\n“,x,y);}
Porque se pasan parámetros por valor!!
Solución: pasar parámetros por referencia!
=> usar punteros !!
Definición y operador &
• Puntero es una variable cuyo contenido es la dirección de una variable. (apunta a una variable)
• Ejemplo: sea p una variable de tipo puntero y c una variable de cualquier tipo:
p = &c;
El operador unario & entrega la dirección del objeto que le sucede.
.............
p: c:
Operador *• El operador unario *, permite el acceso al contenido de la
dirección apuntada por la variable puntero que le sucede. • Ofrece un nombre alternativo para la variable apuntada.• Sean c y f dos variables enteras, sea p una variable
puntero que “apunta a c”.
*p = 2;
Es lo mismo que: c = 2; f = c + 1;
............. 2
f:
f =*p + 1;
3
c:p:
Ejemplo
int x = 1, y = 2; int *ip; /* ip es puntero a entero */ ip = &x; /* ip apunta al entero x */ y = *ip; /* y es ahora 1 */ *ip = 0; /* x es ahora 0 */
1
Ejemplo (cont.)
.............x:
int x = 1, y = 2; int *ip; /* ip es puntero a entero */ ip = &x; /* ip apunta al entero x */ y = *ip; /* y es ahora 1 */ *ip = 0; /* x es ahora 0 */
y:
1 2
1
.............
ip: x:
int x = 1, y = 2; int *ip; /* ip es puntero a entero */ ip = &x; /* ip apunta al entero x */ y = *ip; /* y es ahora 1 */ *ip = 0; /* x es ahora 0 */
y:
1 2?
Ejemplo (cont.)
1
.............
ip: x:
int x = 1, y = 2; int *ip; /* ip es puntero a entero */ ip = &x; /* ip apunta al entero x */ y = *ip; /* y es ahora 1 */ *ip = 0; /* x es ahora 0 */
y:
1 2
Ejemplo (cont.)
.............
ip: x:
El operador unario * es el operador de indirección.
int x = 1, y = 2; int *ip; /* ip es puntero a entero */ ip = &x; /* ip apunta al entero x */ y = *ip; /* y es ahora 1 */ *ip = 0; /* x es ahora 0 */
y:
1 1
Ejemplo (cont.)
1
Ejemplo (fin)
El operador unario * es el operador de indirección.
int x = 1, y = 2; int *ip; /* ip es puntero a entero */ ip = &x; /* ip apunta al entero x */ y = *ip; /* y es ahora 1 */ *ip = 0; /* x es ahora 0 */
.............
ip: x: y:
0 1
Aritmética de punteros
• El contenido de un puntero puede ser modificado realizando operaciones aritméticas enteras simples.
float *p; / * un float tiene 4 bytes */p = p + 2; /* p apunta ahora a una variable 2*4 bytes de distancia del la anterior */
.............
p:
1 byte 1 float
Aritmética de punteros (ejemplo)
int x = 0, y = 1, z = 2;/* globales */ int *ip; /* ip es puntero a entero */ ip = &x; /* ip apunta al entero x */ *ip = *ip + 1; /* x es ahora 1 */ ip = ip + 1; /* ip apunta ahora a y */ *ip = *ip + 1; /* y es ahora 2 */ ip = ip + 1; /* ip apunta ahora a z */ *ip = *ip + 1; /* z es ahora 3 */
Aritmética de punteros (cont.)
.............x:
int x = 0, y = 1, z = 2;/* globales */ int *ip; /* ip es puntero a entero */ ip = &x; /* ip apunta al entero x */ *ip = *ip + 1; /* x es ahora 1 */ ip = ip + 1; /* ip apunta ahora a y */ *ip = *ip + 1; /* y es ahora 2 */ ip = ip + 1; /* ip apunta ahora a z */ *ip = *ip + 1; /* z es ahora 3 */
y:
0 2
z:
1
.............
ip: x:
int x = 0, y = 1, z = 2;/* globales */ int *ip; /* ip es puntero a entero */ ip = &x; /* ip apunta al entero x */ *ip = *ip + 1; /* x es ahora 1 */ ip = ip + 1; /* ip apunta ahora a y */ *ip = *ip + 1; /* y es ahora 2 */ ip = ip + 1; /* ip apunta ahora a z */ *ip = *ip + 1; /* z es ahora 3 */
y:
0 2
z:
1?
Aritmética de punteros (cont.)
.............
ip: x:
int x = 0, y = 1, z = 2;/* globales */ int *ip; /* ip es puntero a entero */ ip = &x; /* ip apunta al entero x */ *ip = *ip + 1; /* x es ahora 1 */ ip = ip + 1; /* ip apunta ahora a y */ *ip = *ip + 1; /* y es ahora 2 */ ip = ip + 1; /* ip apunta ahora a z */ *ip = *ip + 1; /* z es ahora 3 */
y:
0 2
z:
1
Aritmética de punteros (cont.)
.............
ip: x:
int x = 0, y = 1, z = 2;/* globales */ int *ip; /* ip es puntero a entero */ ip = &x; /* ip apunta al entero x */ *ip = *ip + 1; /* x es ahora 1 */ ip = ip + 1; /* ip apunta ahora a y */ *ip = *ip + 1; /* y es ahora 2 */ ip = ip + 1; /* ip apunta ahora a z */ *ip = *ip + 1; /* z es ahora 3 */
y:
1 2
z:
1
Aritmética de punteros (cont.)
.............
ip: x:
Int x = 0, y = 1, z = 2;/* globales */ int *ip; /* ip es puntero a entero */ ip = &x; /* ip apunta al entero x */ *ip = *ip + 1; /* x es ahora 1 */ ip = ip + 1; /* ip apunta ahora a y */ *ip = *ip + 1; /* y es ahora 2 */ ip = ip + 1; /* ip apunta ahora a z */ *ip = *ip + 1; /* z es ahora 3 */
y:
0 2
z:
1
Aritmética de punteros (cont.)
.............
ip: x:
int x = 0, y = 1, z = 2;/* globales */ int *ip; /* ip es puntero a entero */ ip = &x; /* ip apunta al entero x */ *ip = *ip + 1; /* x es ahora 1 */ ip = ip + 1; /* ip apunta ahora a y */ *ip = *ip + 1; /* y es ahora 2 */ ip = ip + 1; /* ip apunta ahora a z */ *ip = *ip + 1; /* z es ahora 3 */
y:
0 2
z:
2
Aritmética de punteros (cont.)
.............
ip: x:
int x = 0, y = 1, z = 2;/* globales */ int *ip; /* ip es puntero a entero */ ip = &x; /* ip apunta al entero x */ *ip = *ip + 1; /* x es ahora 1 */ ip = ip + 1; /* ip apunta ahora a y */ *ip = *ip + 1; /* y es ahora 2 */ ip = ip + 1; /* ip apunta ahora a z */ *ip = *ip + 1; /* z es ahora 3 */
y:
0 2
z:
2
Aritmética de punteros (cont.)
Aritmética de punteros (fin)
.............
ip: x:
int x = 0, y = 1, z = 2;/* globales */ int *ip; /* ip es puntero a entero */ ip = &x; /* ip apunta al entero x */ *ip = *ip + 1; /* x es ahora 1 */ ip = ip + 1; /* ip apunta ahora a y */ *ip = *ip + 1; /* y es ahora 2 */ ip = ip + 1; /* ip apunta ahora a z */ *ip = *ip + 1; /* z es ahora 3 */
y:
0 3
z:
2
Otra imagen de punteros
.............
ip: x: y:
0 3
z:
2
Otra imágen de punteros
........................
ip
x: y:
0 3
z:
2
1
Intercambio sin error#include <stdio.h>void intercambio(int *, int *); /* prototipo */main(){
int a=1,b=2; printf("a=%d b=%d\n",a,b);
intercambio(&a,&b); /* llamada */ printf("a=%d b=%d\n",a,b);
return 0;}void intercambio(int *x, int *y){ /* declaración formal */int temp;temp=*x; // *x, *y son nombres alternativos de a y b*x=*y; *y=temp; }