Curso de C++ (Página 16b)

pagina016a Principal pagina017a

CAPITULO 16b Funciones II: Parámetros por valor y por referencia.

Punteros como parámetros de funciones:

Cuando pasamos como parámetro por valor de una función un puntero pasa lo mismo que con las variables. Dentro de la función trabajamos con una copia del puntero. Sin embargo, el objeto apuntado por el puntero será el mismo, los cambios que hagamos en los objetos apuntados por el puntero se conservarán al abandonar la función, sin embargo los cambios que hagamos al propio puntero no.

Ejemplo:

#include <iostream.h>
 
void funcion(int *q);
 
int main() { 
   int a; 
   int *p;
 
   a = 100; 
   p = &a; 
   // Llamamos a funcion con un puntero funcion(p); 
   cout << "Variable a: " << a << endl; 
   cout << "Variable *p: " << *p << endl; 
   // Llamada a funcion con la dirección de "a" (constante) 
   funcion(&a); 
   cout << "Variable a: " << a << endl; 
   cout << "Variable *p: " << *p << endl; 
   return 0; 
}
 
void funcion(int *q) { 
   // Cambiamos el valor de la variable apuntada por 
   // el puntero 
   *q += 50; 
   q++; 
} 

Con este tipo de parámetro para función pasamos el puntero por valor. żY cómo haríamos para pasar un puntero por referencia?:

void funcion(int* &q);

El operador de referencia siempre se pone junto al nombre de la variable.

Arrays como parámetros de funciones:

Cuando pasamos un array como parámetro en realidad estamos pasando un puntero al primer elemento del array, así que las modificaciones que hagamos en los elementos del array dentro de la función serán validos al retornar.

Sin embargo, si sólo pasamos el nombre del array de más de una dimensión no podremos acceder a los elementos del array mediante subindices, ya que la función no tendrá información sobre el tamaño de cada dimensión.

Para tener acceso a arrays de más de una dimensión dentro de la función se debe declarar el parámetro como un array Ejemplo:

#include <iostream.h>
 
#define N 10 
#define M 20
 
void funcion(int tabla[][M]); 
// recuerda que el nombre de los parámetros en los 
// prototipos es opcional, la forma: 
// void funcion int [][M]); 
// es válida también.
 
int main() { 
   int Tabla[N][M]; 
...
   funcion(Tabla); 
...
   return 0; 
}
 
void funcion(int tabla[][M]){ 
...
   cout << tabla[2][4] << endl;
...
} 

Estructuras como parámetros de funciones:

Las estructuras también pueden ser pasadas por valor y por referencia.

Las reglas se les aplican igual que a los tipos fundamentales: las estructuras pasadas por valor no conservarán sus cambios al retornar de la función. Las estructuras pasadas por referencia conservarán los cambios que se les hagan al retornar de la función.


pagina016a Principal pagina017a