[C con Clase] Alguien podria decirme donde esta el error? novatada

Salvador Pozo salvador en conclase.net
Jue Jul 19 10:50:36 CEST 2007


El pasado 2007-07-19 06:08:02, tataraperz escribió:
 
t> gracias por la pronta respuesta, me disculpo por lo de poner en un mal lugar mi duda, pero ahora que lo dices, mando mis respuestas a ese correo y me responden privadamente, o lo mando y aparece en una lista de correo? si es asi, donde esta?

La dirección corresponde a una lista privada, (en la que sólo estamos los administradores), y las respuestas son privadas y personales.

La idea es que cada uno resuelva los problemas a su manera, no queremos dar soluciones ni orientaciones, ni que las pistas o soluciones de unos alumnos influyan en las de otros.

El objetivo es que cada uno aprenda con su propia experiencia, y sabemos que no todos tropezamos con los mismos problemas, y lo que para unos es sencillo, para otros es complicado, y viceversa.

Además, no hay soluciones únicas para los problemas, y nos gusta que cada uno explore sus propias vías para solucionar los problemas.

t> y ya que estamos puestos para no desperdiciar espacio, me surgio una duda,
t> los arrays(arreglos) que son pasados como argumentos a una funcion, son pasados por referencia? o sea el array que pase a una funcion sera modificado y permanecera modificado aun que ya no este dentro de la funcion?
t> estuve viendo algunos ejemplos de ordenamientos y me surgio esa duda al ver eso.

Los parámetros especificados en las funciones como "por valor", es decir, que no sean referencias o punteros, siempre son pasados por copia, ya sean enteros, arrays o punteros.

Sin embargo, hay que matizar esto. A ver si lo puedo explicar claramente. :-)

En C/C++, un identificador de array se trata exactamente igual que un puntero constante.

Partiendo de ahí, no sería posible pasar una referencia a un array, ya que su dirección es constante, por lo tanto no es modificable.

Por lo tanto, sabemos que los arrays se pasan por copia, pero esto se refiere a la dirección, no a los elementos que contiene.

Veamos un ejemplo.

Supongamos que tenemos un array:

int array[10];

El compilador, por poner un ejemplo, asignará una memoria para almacenar los datos del array. Digamos que la dirección es 0x00001000. A partir de esa dirección se almacenan los 10 enteros del array.

Si pasamos este array como parámetro a una función:

void funcion(int parametro[]);

...
// Llamada
funcion(array);

El mecanismo de los parámetros por valor (o copia), indica que se creará una "variable local" en la función con el nombre "parametro", que tendrá un valor copiado desde el parámetro "array". En resumen, se asigna a "parametro" el valor 0x00001000.

Dentro de la función podemos modificar muchas cosas, pero supongamos dos casos que pueden ilustrar nuestro ejemplo:

1) Se modifica el valor de "parametro".

Se trata de un parámetro por valor, de modo que podemos modificarlo, pero al regresar, el valor de "array" no cambiará, porque es un parámetro por valor. Esto es normal, y es lo deseable y lo que podemos esperar.

2) Se modifica alguno de los elementos del array "parametro", por ejemplo, parametro[3].

parametro[3] = 123;

En este caso, lo que estamos modificando es el espacio de memoria correspondiente al cuarto entero (empezamos a contar en 0) a partir de la dirección de memoria apuntada por "parametro".

Pero recordemos que, al menos inicialmente, "parametro" apunta a la misma dirección que "array", de modo que es lo mismo modificar el valor de parametro[3] que el de array[3].

Por lo tanto, cuando se accede a elementos del array, no importa si el parámetro fue pasado por valor o por referencia, ya que accedemos a direcciones de memoria apuntadas por esos parámetros.

Esto puede despistar un poco, pero si se comprende que los arrays son punteros (a cierto nivel), y cómo se trabaja con valores y referencias de punteros, todo queda algo más claro. (Espero).

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


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