6.10.- Apuntadores a apuntadores


Como se vió al principio de la unidad, un apuntador también es una variable. Su dirección puede ser almacenada por otra variable apuntador, por lo que puede hablarse de un apuntador a un apuntador.

Esto puede extrapolarse para dos o más variables, como se observa en el listado 6.14.

 #include <iostream.h>
 #include <conio.h>

  void main()
  { 
    int x, *a, **b, ***c ;     // 1
    clrscr();
    a  = &x ;                  // 2
    *a = 100 ;                 // 3
    b = &a ;                   // 4 
    **b += *a ;                // 5
    c = &b ;                   // 6  
    ***c += **b + *a ;         // 7
    cout << " *a=" << *a << " \n" ; cout << " **b=" << **b << " \n" ; cout << "***c=" << ***c << " \n" ; getch(); } 

Listado 6.14.- Ejemplo de apuntadores a apuntadores. A continuación se analizan las líneas marcadas en el listado 6.14.

int x, *a, **b, ***c; // 1

Se declaran:

x como una variable de tipo entero. a como un apuntador a objetos de tipo entero. b como un apuntador a un apuntador, el cual a su vez apuntará a objetos de tipo entero. Se dice que b es "el apuntador del apuntador". c como un apuntador a un apuntador que apunta a otro apuntador, el cual a su vez apunta a objetos de tipo entero. Se dice que c es "el apuntador del apuntador del apuntador".

La pila luciría así:

a = &x ; // 2

Se asigna, al apuntador a, la dirección de x. La pila luciría así:

*a = 100 ; // 3

Al objeto apuntado por a se le asigna el valor 100. La pila luciría así:

b = &a ; // 4

Al apuntador b se le asigna la dirección del apuntador a. La pila luciría así:

**b += *a ; // 5

Al objeto apuntado por el apuntador apuntado por b se le suma el valor del objeto apuntado por a. La pila luciría así:

c = &b ; // 6

Al apuntador c se le asigna la dirección del apuntador b. La pila luciría así:

***c += **b + *a ; // 7

Se asigna al objeto apuntado por el apuntador apuntado por el apuntador c, el valor del objeto apuntado por el apuntador apuntado por el apuntador b más el valor del objeto apuntado por el apuntador a. La pila luciría así:

_ Gif animado

_ Applet animado

El listado 6.15 muestra otro ejemplo de manejo de apuntadores a apuntadores. En él, la línea de cabecera de la definición de main() contiene argumentos entre los paréntesis. Esto significa que, al invocar al programa ECO.EXE desde la línea de comandos, se le pueden pasar argumentos. Estos argumentos serán tomados como cadenas de caracteres que serán manejadas por **argumentos. La variable entera contador contiene el número correspondiente a la cantidad de cadenas que se le pasan a main() en la invocación.

                                                                 
  // ECO.CPP : Maneja argumentos en la invocación a main(),
  //           de manera similar a como trabaja la orden
  //           ECHO del sistema operativo

 #include <iostream.h>

  void main(int contador, char **argumentos)
  {
    cout << "\n"; for( int x="1" ; contador--> 0 ; x++)
      {
	 int y = 0 ;
	 do{
	     cout << argumentos[x][y++]; } while(argumentos[x][y]); cout << " "; } cout << "\n"; } 

Listado 6.15.- Paso de argumentos a main(). Por ejemplo, si escribimos en la línea de comandos:

A:\> ECO HOLA AMIGOS !!!

en la pantalla aparecerá:

HOLA AMIGOS !!!

En este caso:

argumentos[0] = ECO 1 argumentos[1] = HOLA 2 argumentos[2] = AMIGOS 3 argumentos[3] = !!! 4 <---- Número de argumentos contador="4"

La línea de cabecera de la función main() pudo escribirse de esta otra forma:

void main(int contador, char *argumentos[]) ya que existe la siguiente equivalencia :

Esto puede generalizarse, de manera que:

  *cadena ==   cadena[]
 **cadena ==  *cadena[] 
***cadena == **cadena[]

El uso de corchetes vacíos sólo es válido cuando se realiza una asignación ó cuando se escriben los argumentos en la línea de cabecera de la definición de una función. Sólo el par de corchetes de la extrema derecha puede escribirse vacío, los demás deberán contener un valor constante.

La línea de cabecera en la definición de la función main() puede tomar también la siguiente forma:

void main(int contador, char **argumentos, char **ambiente)

donde:

**ambiente se refiere a un conjunto de cadenas de caracteres correspondientes al ambiente del sistema operativo, como las asignadas a prompt, path , etc.

Página anterior Página siguiente