Punteros y Arreglos
Punteros

¿Qué es un puntero?
Punteros
- Una variable que apunta a otra variable.
- Un puntero
- Contiene la dirección de otra variable.
- Es una referencia a otra variable.
- Operador &
- Permite obtener la dirección de una variable.
- Válido para cualquier variable.
- Operador *
- Permite acceder al objeto al que el puntero apunta (indirección).
- Sólo es válido para punteros.
Ejemplo
int a = 10, b = 20, c[10];int *p; p = &a;b = *p;*p = 0;p = &z[0];
Trivia
int main() { int y, *z; y = 4; z = &y; y = *z + 9;return 0; }
¿Cuál es el valor final de y?
Trivia
int main() { int foo, *bar, **baz, quux;bar = &quux; foo = 4;baz = &bar; **baz = 13;bar = &foo; **baz = 9;return 0; }
¿Cuál es el valor final de foo y bar?
Trivia
int main() { int a, b, *p, *q;a =10; b =20;p = &a; q = &b; *q = a + b;a = a + *q; q = p; *q = a + b;printf("a=%d b=%d *p=%d *q=%d",a,b,*p,*q); }
¿Cuál es el output del programa?
Punteros y Arreglos
char *str_ptr; char str_array[];str_pointer++; // Se valestr_array++; // No se vale :(int* int_array = {1, 2, 3}; // No se vale :(
Punteros y Arreglos
- El nombre de un arreglo
- Es la dirección de la base del arreglo.
- NO es un puntero.
- Durante el ensamblaje, el nombre se reemplaza por la dirección.
- No obstante, podemos utilizar punteros para agregar algo de practicidad.
Punteros y Arreglos
int array[5] = {1, 2, 3, 4, 5};// ptr = array; int *ptr = &array[0]; array[1]; // *(ptr+1); array[3]; // *(ptr+3); array[2] = 5; // *(ptr+2) = 5;
Aritmética de Punteros
*p++ vs (*p)++
x = *p++;=> p = p + 1;=> x = *p;x = (*p)++;=> *p = *p + 1;=> x = *p;
Aritmética de punteros
- pointer + integer
- integer + pointer
- pointer + pointer
- pointer – integer
- integer – pointer
- pointer – pointer
- compare pointer to pointer
- compare pointer to integer
- compare pointer to 0
- compare pointer to NULL
¿Cuáles son válidos?
Aritmética de punteros
- pointer + integer
- integer + pointer
- pointer + pointer
- pointer – integer
- integer – pointer
- pointer – pointer
- compare pointer to pointer
- compare pointer to integer
- compare pointer to 0
- compare pointer to NULL
Arreglos de punteros
int* ptr_array[10];- ptr_array es un arreglo:
- 10 posiciones
- cada posición es un puntero.
int* p = ptr_array[0];// p es el puntero en la posición 0int a = *ptr_array[0];// a es el contenido del puntero en la pos. 0
Punteros vs Arreglos multidimensionales
int a[10][10];int *b[10];
- a es una matriz
- 10 x 10 (100 enteros)
- tamaño constante
- b es un arreglo:
- 10 punteros
- cada puntero puede
- apuntar a otros arreglos de distintos tamaños.
- apuntar a enteros u otros tipos de datos.
- no apuntar a nada.
Punteros a funciones
- C permite declarar punteros a funciones.
- Dado que un puntero se puede enviar como argumento, entonces podemos enviar funciones como argumentos!
int (*func)();Más aritmética de punteros
x = *(p+1) => x = *(p+1);x = *p+1 => x = (*p) + 1;x = (*p)++ => x = *p; => *p = *p + 1;x = *p++ ? (*p++) ? *(p)++ ? *(p++) ? => x = *p ; p = p + 1;x = *++p ? => p = p + 1 ;=> x = *p ;
Argumentos por Referencia
void addOne(int x){x = x + 1;} int y = 5; addOne(y);printf(“y = %d\n”, y);
¿Cuál es el output del programa?
Argumentos por Referencia
void addOne(int *p){*p = *p + 1;} int y = 5; addOne(&y);printf(“y = %d\n”, y);
¿Cuál es el output ahora?
Argumentos por Referencia
void incrementPtr(int *p){p = p + 1;} int a[3] = {50, 60, 70}; int *q = a;incrementPtr(q); printf(“*q = %d\n”, *q);
¿Cuál es el output del programa?
¿Qué pasa con q?
Argumentos por Referencia
void incrementPtr(int **h){*h = *h + 1;} int a[3] = {50, 60, 70}; int *q = a;incrementPtr(&q); printf(“*q = %d\n”, *q);
¿Cuál es el output del programa?
¿Qué pasa con q?
Punteros y Arreglos
By Diego Figueroa
Punteros y Arreglos
- 1,137