[C con Clase] Prototipos!!
Steven Davidson
srd4121 en njit.edu
Mie Jun 11 21:46:38 CEST 2008
Hola Zaka,
Zaka Elab wrote:
> Si te fijas he enviado dos correos de respuesta a tu respuesta, en el
> segundo está claro todo, pero en el primero, si te fijas, la salida
> no es la esperada, ya que como bien has dicho lo que se modifica es
> lo mismo ya que se pasan referencias.
>
> Es este código el que me produce problemas:
>
> #include <iostream>
>
> using namespace std;
>
> void foo(char a[10]){
> a="aaaa";
> }
>
> int main(){
>
> char a[10]= "bbbb";
>
> cout << "La cadena vale: " << a << endl;
>
> foo(a);
>
> cout << "Ahora vale: " << a << endl;
>
> return 0;
> }
>
> Según lo que dices, y con lo que yo estoy de acuerdo, la salida
> debería ser:
>
> La cadena vale: bbbb
> Ahora vale: aaaa
>
No. Yo no dije esto. Lo que dije fue que lo siguiente es un error:
void foo( char a[10] )
{
a = "aaaa";
}
La asignación es errónea, no sólo conceptualmente, sino gramaticalmente.
El compilador debe darte un mensaje de error, como por ejemplo,
"ISO C++ prohíbe la asignación de arrays"
o quizá,
"asignación de la variable de sólo-lectura 'a'"
Debo decir que acabo de comprobar el código bajo Dev-C++ y efectivamente
no me marca ningún error. Me parece sumamente raro, pero qué se le va a
hacer. La posible explicación de la ausencia del mensaje de error es que
toma el parámetro local 'a' como un puntero, y no como un puntero constante.
De todas maneras, nunca saldría en pantalla:
Ahora vale: aaaa
Esto es porque no estamos manipulando los elementos del array original
'a', sino el puntero local 'a'. Por ejemplo, puedes hacer lo siguiente:
void foo( char *ptr )
{
ptr = "aaaa";
}
...
char a[] = "bbbb";
foo( a );
'a' nunca será cambiado por 'foo()', porque en 'foo()' simplemente
manipulamos el puntero 'ptr' para que apunte a otra cadena.
Si necesitas una explicación más detallada, házmelo saber.
Espero que esto te sirva.
Steven
Más información sobre la lista de distribución Cconclase