[C con Clase] Cómo se pasa un arreglo por parámetro?

Steven Davidson srd4121 en njit.edu
Mar Mayo 6 05:07:37 CEST 2008


Hola David,

David Reza wrote:
> 

[CORTE]

> Ya me confundí un poco. Al escribir:
> 
> //Prototipo función
> tipo funcion(tipo []);
> 
> //Main
> int main
> {
>     ....
>     funcion(arreglo);
>     ...
> }
> 
> //Declaración función
> tipo funcion(tipo identificador[])
> {
>     ...
> }
> 
> Estoy pasando el arreglo por valor? Si es así, por qué?
> 

Un puntero es un tipo de dato como cualquier otro; tiene:
- un conjunto de operaciones establecido,
- una cantidad de bytes que ocupa memoria.

Una variable de tipo puntero requiere memoria, como cualquier variable, 
porque necesita guardar un valor. En este caso el valor a guardar es una 
dirección de memoria.

Cuando pasamos direcciones de memoria, éstas son copiadas al parámetro 
de la función. Por ejemplo,

void func( int *p, float f );

int main()
{
   int *ptr;
   float num;
   ...
   func( ptr, num );
   ...
}

void func( int *p, float f )
{
...
}

Básicamente, la invocación de 'func()' implica las siguientes sentencias:

int *p  = ptr;
float f = num;

Como puedes ver, creamos la variable 'p', que es el parámetro de la 
función, y la inicializamos a 'ptr', o mejor dicho, al valor en 'ptr'. 
También puedes notar que es lo mismo que hacemos con las variables de 
tipo 'float: 'f' y 'num'.

En el caso del array, éste ES una dirección de memoria; es la dirección 
de memoria del primer elemento en el array. Podemos pensar que un array 
es un puntero constante, ya que no podemos cambiar un 'array'.

Dicho lo anterior, un array puede actuar como un puntero porque ambos 
conceptos manejan direcciones de memoria. Esto significa que un array es 
pasado por copia (o por valor). Esto no tiene nada que ver con los 
elementos de un array o los elementos apuntados por un puntero. Estos 
elementos no son pasados directamente a la función, sino que son 
manipulados indirectamente a través del array o del puntero.

> Puedo pasar un solo elemento del array si en el main utilizo la
> función así: ?
> 
> ...
> funcion(arreglo[56]);
> ....
> 

Podrías, pero no con 'funcion()', al menos que la declares y la definas 
aceptando un parámetro de tal tipo. En tu ejemplo, esto sería,

void funcion( int a );
...
int main()
{
   int array[100];
   ...
   funcion( array[56] );
   ...
}

Recuerda que los tipos de datos SIEMPRE deben concordar.

> Y para pasar un arreglo  por referencia se utilizarían los punteros?
> 

En C++, no es necesario, ya que tenemos el paso por referencia. Esto se 
haría así:

int funcion( int &array[] );

int main()
{
   int lista[50];
   ...
   funcion( array );
   ...
}

Ahora bien, esto no tiene mucho sentido, porque no podemos hacer mucho 
con un array excepto usarlo para controlar sus elementos. Recuerda que 
no podemos reasignar un array, pero sí sus elementos. Dicho esto, sería 
superfluo pasar un array por referencia. Esto es análogo a hacer lo 
siguiente:

int funcion( const int &ref );

int main()
{
   const int n = 5;

   funcion( n );
   ...
}

Podemos hacer esto, pero no hay ventaja alguna en ello, porque no 
podemos hacer nada con la constante original de 'n', excepto conseguir 
su valor.

Con un puntero, sí existen aplicaciones al pasar punteros por 
referencia. Esto significa que podemos modificar el valor original del 
puntero.


Espero que todo esto sirva para aclarar este tema.

Steven






Más información sobre la lista de distribución Cconclase