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 vale
str_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 0
int 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,123