[C con Clase] Tamanyo de una matriz externa dentro de una funcion

srd4121 en njit.edu srd4121 en njit.edu
Jue Nov 27 19:03:51 CET 2008


Hola Narcis,

Quoting Narcis Garcia - GiLUG <informatica en actiu.net>:

> Tal y como leo en el curso de C++:
> http://c.conclase.net/curso/index.php?cap=015b
> Al pasar una matriz como parámetro de una función, en realidad se pasa
> un puntero, o sea, que no se pasan patrices por valor sino siempre por
> referencia.
> 

Ten mucho cuidado con la terminología que usas. Conceptualmente y desde el punto
de vista de los valores en el array (o matriz), es cierto que éstos son pasados
por referencia. Sin embargo, técnicamente, en C/C++, no estamos pasando la
matriz por referencia sino por copia. Lo que copiamos es el puntero. Por eso,
podemos emular el paso por referencia usando punteros; esto se suele decir de C.
Al final, el resultado es el mismo: manipulamos los valores originales
contenidos en el array o matriz. 

> Así pues, en esta función, en un entorno de 32bits, como tamaño de la
> variable se obtiene 4 (4 bytes del puntero), y no el tamaño de los
> datos:
> 
> void MiFuncion(int LaMatriz[])
> {
> int NrElementosMatriz;
> NrElementosMatriz = sizeof(MiMatriz)/sizeof(MiMatriz[0]);
> return 0;

Por cierto, aquí no debería haber ninguna sentencia 'return', ya que esta
función no retorna un valor.

> }
> 
> ¿Cómo puedo obtener el tamaño de los datos referidos?

No puedes averiguar su tamaño basándote en el array. Lo que debes hacer es
rediseñar la función para aceptar este otro dato: el tamaño. Por ejemplo,

void MiFuncion( int array[], int nElem );

Con esto, la invocación o la parte del código que invoque esta función se
encarga de averiguar y pasar el tamaño del array.

> ¿sizeof se comporta igual cuando pasamos una variable cualquiera por
> referencia?
> 

Nuevamente, hay que tener cuidado con los términos. Si te refieres al paso por
referencia que implementa C++, usando el símbolo &, entonces sí. El operador
'sizeof' funcionará correctamente. Recuerda que una referencia no es más que un
sobrenombre o apodo; es decir, otro nombre para la variable original. De esta
manera, decimos que una referencia se refiere a la misma variable y por tanto
obtenemos el mismo valor.


Espero haber aclarado las dudas.

Steven





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