¿Las matrices se pasan a las funciones por valor o referencia? [C]

Iniciado por NOB2014, 4 Junio 2016, 16:50 PM

0 Miembros y 1 Visitante están viendo este tema.

NOB2014

Hola, gente.

CitarPassing a One-Dimensional Array
When a one-dimensional array is passed to a function, the array's address is passed by
value. This makes the transfer of information more efficient since we are not passing
the entire array and having to allocate memory in the stack for it. Normally, this means
the array's size must be passed. If we don't, from the function's perspective all we have
is the address of an array with no indication of its size.

Los consulto porque tengo una duda con esta parte del libro, si mi traductor no falla dice que las matrices se pasan a funciones por valor, yo tengo entendido que el identificador de una matriz contiene la dirección de memoria del primer elemento o primer byte de la misma, por lo tanto, cualquier modificación que se efectué en la función llamada se ve reflejado en la función llamadora como lo refleja el código que dejo a continuación. -

#include <stdio.h>

void ab( int a[], size_t tam );

int main( void ){
int a[] = {5, 3, 8, 99, 11};
size_t tam = 5;

printf( "\n \"a\" antes de la llamada a la funcion vale........:%d", a[0] );
ab(a, tam);
printf( "\n \"a\" despues de la llamada a la funcion vale......:%d\n\n", a[0] );


}

void ab( int a[], size_t tam ){
a[0] = 1;
}

Es todo, espero que alguien me diga como debo interpretar esto. -   

Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

class_OpenGL

#1
En C el paso por referencia o valor se confunde mucho. Aunque parezca extraño, todo en C se pasa por valor. Cuando pasas un arreglo por parámetros lo que pasas es una copia de la dirección al primer byte del arreglo.

Algunos interpretan que cuando una función pide una dirección de una variable la variable en sí es pasada por referencia, pues la función puede cambiar el valor de la variable, pero no se ha de confundir el paso por valor por el paso por referencia. Estas definiciones están mucho más claras en C++

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

DarK_FirefoX

En C los arrays de una dimensión se pasan a una función por referencia, no obstante, el valor de la referencia se pasa por valor! O sea, la dirección en memoria (referencia) que se le pasa a la función, se pasa por valor. Debido esto, normalmente se pasa el tamaño del array en otro parámetro para tener control de cual tamaño tiene el array.

Espero te haya aclarado algo.

Salu2s

NOB2014

Hola, mucha gracia a ambos por ocuparse. -
Me queda todo muy claro, el identificador del array se pasa por valor y como la función llamada recibe una copia exacta de la dirrección del primer elemento del array, toda modificación que se efectúe en dicha función se ve reflejada en el array original. -
Voy a agregar que los elementos del array individualmente se pasan por valor, les dejo este Ej. de Eternal Idol (que encontré en el foro) para pasarlos por referencia. -

#include <stdio.h>

int Valor(int);
int Referencia(int*);

int main(void)
{
    int array[30];
    array[4] = 33;
   
    printf("Posicion 5, Valor: %d\r\n", Valor(array[4]));
    printf("Posicion 5, Valor: %d\r\n", array[4]);
    printf("Posicion 5, Referencia %d\r\n", Referencia(&array[4]));
    printf("Posicion 5, Referencia %d\r\n", array[4]);
   
    return 0;
}

int Valor(int v)
{
  return v;
}


int Referencia(int *r)
{
  return (*r)++;
}


Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-