punteros - wordpress.com · definición y operador & • puntero es una variable cuyo contenido...

Post on 30-Jul-2020

5 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