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

Post on 02-Feb-2016

225 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

top related