Si, es cierto, pero la función que recibe un vector de caracteres no se limita a imprimir ese carácter ... la función que recibe un vector de caracteres va a procesar todos los caracteres del vector hasta que encuentre un carácter nulo.
Me estaba refiriendo a lo que decía el autor del tema.
Entonces he escrito lo siguiente:
#include <iostream>
using namespace std;
void something(char *text)
{
cout << *text;
}
int main()
{
char v[]="Probando";
cout<<&v<<endl;
cout<<v<<endl;
something(v);
return 0;
}
Y pues, yo creí que pasar como argumento
v es lo mismo que pasar
&v (pero no es exactamente lo mismo).
Lo primero muestra la dirección de memoria del primer elemento.
Lo segundo imprime toda la cadena como dices.
Pero yo me refería a lo tercero, que sólo muestra el primer caracter (es por el operador de indirección).
Si escribo lo siguiente, sigue mostrando solo la letra 'P':
char* p = v;
cout<<*p;
Eso quiere decir que cuando a cout le paso
v o
&v[0] es lo mismo... o incluso si le paso
p, pero escribir
*p ya le quita la gracia porque muestra el valor del elemento correspondiente a la dirección de memoria (es decir, sólo
v[0]).
Entonces podemos decir que v es como un puntero constante a char.
Cuando cout recibe un puntero a char (sea constante o no), muestra el valor apuntado por ese puntero y los valores ubicados en las direcciones de memoria que le siguen, hasta encontrar la marca de fin de cadena.
Pero al escribir
&v es como querer obtener la dirección de memoria de algo que ya propiamente es una dirección de memoria y se muestra entonces la dirección de memoria de v[0].
¿Sería la única forma de mostrar la dirección de memoria de v usando cout?Si muestro por pantalla
&p (donde p es una variable puntero que almacena la dirección de memoria de v[0]) debería pasar lo mismo (pues estoy tratando de obtener la dirección de memoria de una dirección de memoria). Pero al probar esto, la dirección que se muestra es la dirección de la variable puntero, y no se está desreferenciando una dirección de memoria, que es lo que aproximadamente sucede al hacer &v (creo que me estoy haciendo mucho lío en vano
).
No se me permite hacer algo como:
p = &v;
Pero sí esto:
p = &v[0];
cout<<*p;
Y el resultado nuevamente es 'P'.
A ver, cout es una clase de c++. Esta clase tiene varias sobrecargas del operador de inserción ( << ), una para cada tipo de dato soportado.
En realidad cout es un objeto de la clase ostream (o eso es lo que me dice esta
referencia).
Y respecto a:
void something(char *text){
cout<<&(*(&(*(&(*text)))))<<endl;
cout<<text;
}
En ambos casos te va a mostrar una cadena de texto. A la función que recibe el dato únicamente sabe qué tipo le estás pasando, no entiende de las transformaciones previas que le hayas hecho.
Es porque las transformaciones se hacen previamente y el resultado de dicha expresión es lo que se envía como argumento a cout (ya resuelto), pero eso no implica que yo deba ignorar dichas transformaciones.
Es decir, en este caso se referencia y desreferencia una cantidad igual de veces y luego de hacer todo ello recién muestra lo correspondiente. No es que deba ignorar las transformaciones y fijarme sólo en el tipo de dato que le envío... es decir, si escribiera un
& o un
* menos, el resultado no sería el mismo (aún cuando las conversiones se estén haciendo sobre un tipo de dato
char*).