[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