char *c = "line";
es no lo mismo que
char c[] = "line";
que es realmente lo mismo que
static char hidden_C0[] = "line";
char *c = hidden_C0;
excepto que la variable hidden_C0
no es directamente accesible. Pero lo verás si eliminas el lenguaje ensamblador generado (generalmente tendrá un nombre que no sea un identificador de C válido, como .LC0
). Y en su ejemplo gama de cuerdas-constantes, lo mismo está sucediendo:
char *choices[] = { "New Game", "Continue Game", "Exit" };
convierte
char hidden_C0[] = "New Game";
char hidden_C1[] = "Continue Game";
char hidden_C2[] = "Exit";
char *choices[] = { hidden_C0, hidden_C1, hidden_C2 };
Ahora bien, esta es una conducta caso especial que está disponible única de cadena constantes.No se puede escribir
int *numbers = { 1, 2, 3 };
debe escribir
int numbers[] = { 1, 2, 3 };
y por eso no se puede escribir
char **choices = { "a", "b", "c" };
tampoco.
(Su confusión es un caso especial de la idea errónea de que las matrices son "lo mismo que" punteros en C. Ellos no lo son. Las matrices son matrices. Las variables con tipos de matriz sufren tipo de descomposición a un tipo de puntero cuando son usado (en casi todos los contextos), pero no cuando están definidos.)
C arrays! = Punteros en C. – nmichaels
En el ejemplo 1, c es un puntero a un char. En el ejemplo 2, c es una matriz de caracteres. En el Ejemplo 3, las opciones son un puntero a un puntero a A char (y se le asigna incorrectamente una matriz de caracteres). En el Ejemplo 4, las opciones son una matriz de punteros a caracteres (y se le asigna correctamente una matriz de caracteres) – oosterwal
@oosterwal: para ** ex3 ** y ** ex4 ** dijiste "... asignó una matriz de caracteres", pero es correcto "... asignó una matriz de punteros a los caracteres". Para ** ex3 ** - hay [una posibilidad] (http://stackoverflow.com/questions/4832082/c-double-character-pointer-declaration-and-initialization/4832167#4832167) para asignar un _array de punteros a chars_ usando _compound literals_. –