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