Al pasar un array por parametro a una funciona ¿se pasa una copia?

Iniciado por Aikanáro Anário, 27 Septiembre 2012, 01:33 AM

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

Aikanáro Anário

Eso es lo que he leído en algunos libros, pero según este código no es así:

Código (cpp) [Seleccionar]

#include <iostream>
using namespace std;

void ver(int array[]) {

 array[0] = 10;
 array[1] = 11;
}


int main()
{
 int *array = new int[5];
 array[0] = 0;
 array[1] = 1;
 array[2] = 2;
 array[3] = 3;
 array[4] = 4;

 cout << array[0] << endl;
 cout << array[1] << endl;
 ver(array);
 cout << array[0] << endl;
 cout << array[1] << endl;


}



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.
Lo que faltaba en internet: http://binar10s.blogspot.com/

rir3760

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:
int fn(char a[]);
int fn(char a[N]);

En realidad se procesan de así:
int fn(char *a);

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Aikanáro Anário

Lo que faltaba en internet: http://binar10s.blogspot.com/

Don Pollo

#3
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.