punteros. 1 intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */...

24
Punteros

Upload: julia-fuentes-vera

Post on 02-Feb-2016

225 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

Punteros

Page 2: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

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);}

Page 3: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

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 !!

Page 4: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

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:

Page 5: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

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:

Page 6: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

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 */

Page 7: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

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

Page 8: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

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.)

Page 9: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

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.)

Page 10: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

.............

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.)

Page 11: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

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

Page 12: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

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

Page 13: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

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 */

Page 14: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

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

Page 15: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

.............

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.)

Page 16: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

.............

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.)

Page 17: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

.............

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.)

Page 18: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

.............

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.)

Page 19: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

.............

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.)

Page 20: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

.............

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.)

Page 21: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

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

Page 22: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

Otra imagen de punteros

.............

ip: x: y:

0 3

z:

2

Page 23: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

Otra imágen de punteros

........................

ip

x: y:

0 3

z:

2

Page 24: Punteros. 1 Intercambio con error ¿porqué? #include void intercambio(int, int); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(a,b);

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; }