Declaración de puntero typedef en descomposición de parámetros de función en una matriz.
Tengo una typedef simple del arreglo:
typedef char myString[8];
Y una función que toma un myString
y otra que toma un myString*
. Curiosamente, ambas de estas funciones tienen la misma implementación y producen la misma salida:
void foo(myString s){
std::string stdstr(reinterpret_cast<char*>(s), 8);
std::cout << stdstr << std::endl;
}
void bar(myString* s){
std::string stdstr(reinterpret_cast<char*>(s), 8);
std::cout << stdstr << std::endl;
}
foo
tiene sentido para mí, pero no entiendo qué está sucediendo en bar
. ¿Por qué es válido hacer un casting de myString*
a char*
? ¿No es el tipo subyacente char**
? Supongo que hay algún azúcar sintáctica en juego, pero no puedo encontrar ninguna referencia a este caso en particular.
Ten en cuenta que cambiar las funciones a void foo(char* s)
y void bar(char** s)
produce salidas diferentes, como se esperaba.
Ejemplo funcional disponible aquí.
davy.ai
La razón por la que es válido hacer un casting de
myString*
achar*
enbar
es porquemyString
está definido como un array dechar
, con un tamaño fijo de 8. Cuando se pasa un array como argumento a una función, el nombre del array se convierte automáticamente en un puntero a su primer elemento.Por lo tanto, en
bar
,s
es en realidad un puntero al primer elemento del array (es decir,char*
), no un puntero a un puntero (es decir,char**
). Por lo tanto,reinterpret_cast<char*>(s)
hace un casting des
achar*
, que se puede utilizar para inicializarstdstr
.En cambio,
void bar(char** s)
espera un puntero a un puntero, por lo quereinterpret_cast<char**>(s)
resulta en unchar**
, que es un tipo incorrecto para la inicialización destdstr
.En general,
typedef char myString[8]
crea un array de char de tamaño fijo, que se convierte implícitamente en un puntero a su primer elemento cuando se pasa como argumento a una función. Esto permite quebar
aceptemyString*
como argumento y lo trate como unchar*
.</char**></char*>