Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Aikanáro Anário en 27 Septiembre 2012, 01:33 am



Título: Al pasar un array por parametro a una funciona ¿se pasa una copia?
Publicado por: Aikanáro Anário en 27 Septiembre 2012, 01:33 am
Eso es lo que he leído en algunos libros, pero según este código no es así:

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void ver(int array[]) {
  5.  
  6.  array[0] = 10;
  7.  array[1] = 11;
  8. }
  9.  
  10.  
  11. int main()
  12. {
  13.  int *array = new int[5];
  14.  array[0] = 0;
  15.  array[1] = 1;
  16.  array[2] = 2;
  17.  array[3] = 3;
  18.  array[4] = 4;
  19.  
  20.  cout << array[0] << endl;
  21.  cout << array[1] << endl;
  22.  ver(array);
  23.  cout << array[0] << endl;
  24.  cout << array[1] << endl;
  25.  
  26.  
  27. }
  28.  
  29.  

Si fuera una copia del array lo que se pasara a la función, entonces la posición 0 y 1 del array deberían valer 0, 1 respectivamente, en vez de 10 y 11 que es lo que me muestra cout al ejecutar el código.


Título: Re: Al pasar un array por parametro a una funciona ¿se pasa una copia?
Publicado por: rir3760 en 27 Septiembre 2012, 02:07 am
No. En C y C++ (en este ultimo exceptuando las referencias) todo se pasa por valor salvo los arrays. Con estos lo que se pasa es la dirección del primer elemento.

Y las funciones declaradas en cualquiera de estas dos formas:
Código
  1. int fn(char a[]);
  2. int fn(char a[N]);
En realidad se procesan de así:
Código
  1. int fn(char *a);

Un saludo


Título: Re: Al pasar un array por parametro a una funciona ¿se pasa una copia?
Publicado por: Aikanáro Anário en 27 Septiembre 2012, 04:21 am
¿Qué quiere decir que todo se pasa por valor?


Título: Re: Al pasar un array por parametro a una funciona ¿se pasa una copia?
Publicado por: Don Pollo en 27 Septiembre 2012, 13:38 pm
Pasar por valor un parámetro quiere decir que lo que realmente le estás pasando a la función es una copia del valor de esa variable, no la variable en sí, por lo que si tú modificas ese valor dentro de la función, fuera de ella no va a tener ningún efecto porque con lo que trabaja esa función es con una copia de la variable original.

Cuando pasas por referencia estás pasando a la función la dirección de memoria de la variable en sí, por lo que si la modificas dentro, seguirá estando modificada a la salida. En este caso no se trabaja con una copia, sino con la variable original.

Realmente, el nombre de un array es un puntero al primer elemento. De esta manera, cuando pasas un array como parámetro de una función, estás pasando un puntero que, aunque sea una copia del original, seguirá apuntando al primer elemento del array, por lo que todo lo que modifiques del array se verá alterado también a la salida.