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

24
Punteros

Upload: others

Post on 30-Jul-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Punteros - WordPress.com · 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

Punteros

Page 2: Punteros - WordPress.com · 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

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 - WordPress.com · 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

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 - WordPress.com · 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

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 - WordPress.com · 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

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 - WordPress.com · 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

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 - WordPress.com · 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

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 - WordPress.com · 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

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 - WordPress.com · 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

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 - WordPress.com · 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

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

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 - WordPress.com · 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

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 - WordPress.com · 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

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 - WordPress.com · 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

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 - WordPress.com · 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

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 - WordPress.com · 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

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

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 - WordPress.com · 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

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

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 - WordPress.com · 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

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

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 - WordPress.com · 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

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

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 - WordPress.com · 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

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

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 - WordPress.com · 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

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

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 - WordPress.com · 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

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 - WordPress.com · 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

Otra imagen de punteros

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

ip: x: y:

0 3

z:

2

Page 23: Punteros - WordPress.com · 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

Otra imágen de punteros

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

ip

x: y:

0 3

z:

2

Page 24: Punteros - WordPress.com · 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

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;

}