Declaración e inicialización de puntero de doble carácter C

Declaración e inicialización de puntero de doble carácter C


Siempre pensé que declarar


char *c = "line";

era lo mismo que


char c[] = "line";

y así lo hice


char **choices = { "New Game", "Continue Game", "Exit" };

Lo que me da un tipo de puntero incompatible, donde


char *choices[] = { "New Game", "Continue Game", "Exit" };

no. ¿Alguna ayuda para entender esto?


Respuestas:


Bueno, no son lo mismo. Es más fácil para la mayoría de las personas pensar que son iguales, por lo que todos comienzan a pensar de esa manera hasta que se encuentran con un problema como el anterior :-)


Iba a escribir algo largo y sin aliento, pero luego pensé... Alguien más debe haber hecho esto ya. Y tienen. Esta es una muy buena explicación:


http://www.lysator.liu.se/c/c-faq/c-2.html


La forma más fácil de pensarlo es que cuando haces algo como:



char *foo = "something";

Realmente estás haciendo algo como:



char randomblob[] = "something";
char *foo = randomblob;

Ahora... esa no es realmente una imagen precisa (aunque no soy un experto en compilación). Al menos te permite pensar en las cosas de una manera un poco más correcta.


Entonces, volviendo a tu problema, si I entiende las cosas bien (lo que nunca está garantizado), no puede hacer su línea de ejemplo n. ° 3 en C. Tiene razón en que alguien podría escribir un compilador que haría lo correcto aquí, pero gcc no lo hace. El cuarto ejemplo, sin embargo, hace "lo correcto" y le brinda "una matriz de punteros que apuntan a una matriz de caracteres const".


Una vez encontré una página web que traducía un tipo C complejo al inglés. Sin embargo, eso fue probablemente a principios de los 90, pero apuesto a que si buscas en Google lo suficiente, obtendrás una descripción de redacción más precisa que la que acabo de preparar.