Punteros

Un puntero es un tipo de variable que permite almacenar y manipular las direcciones de memoria donde se encuentran almacenados los datos, en lugar de los datos mismos. El manejo de punteros en el lenguaje C es muy poderoso y eficiente, aunque demanda extremo cuidado en su utilización.

Bien utilizado hace que el código sea más compacto y eficiente; por el contrario, su uso descuidado lleva a tener poca claridad y frecuentemente conduce a la pérdida del control de la CPU, ocasionando un comportamiento indeseable del proceso (vulgarmente se dice que el programa "reventó").

El uso de punteros nos permite acceder al valor de una variable en forma indirecta. Para esto se utilizan dos operadores:

Declaración

Las declaraciones de los punteros se realizan en forma indirecta, declarando el tipo de dato que será apuntado por el mismo. Por ejemplo un puntero a un dato de tipo entero se declara como:

int *px;

Sean ademas x e y dos variables del tipo entero. Existen dos operadores unarios para usarlos con punteros:

Inicialización

Antes de poder ser utilizado, un puntero debe ser inicializado (como cualquier otra variable). Para inicializar un puntero se puede utilizar:

  1. la dirección de memoria de otra variable
    
          y=2, *py;
          py = &y; 
    			
  2. el valor de otro puntero ya inicializado.
          
          y=2, *py = &y, *ppy;
          ppy = py;
    			

Pasaje de argumentos por referencia

Supongamos que queremos realizar una función que recibe dos argumentos y que debe retornar como resultado los valores invertidos de las dos variables.

Sea por ejemplo la siguiente implementación de esta función:

void Swap(int x,  int y)
{
  int Temp;

  Temp = x;
  x = y;
  y = temp;
}

El efecto de esta función no es el deseado, ya que las variables son pasadas por valor, es decir que lo que se modifica no son las variables originales, sino copias de ellas. La forma de hacer esta operación es a través del paso de los argumentos por referencia.

En C esto se implementa haciendo uso de punteros:

void Swap(int *x,  int *y)
{
  int Temp;

  Temp = *x;
  *x = *y;
  *y = temp;
}

Como lo que se están pasando a la función Swap son en realidad direcciones de memoria donde están alojadas las variables originales almacenadas, las modificaciones que se realizan afectan estos valores. La invocación de esta función debe ser de la forma:

Swap(&a,&b);