Dichiarazione e inizializzazione del puntatore a doppio carattere C

Dichiarazione e inizializzazione del puntatore a doppio carattere C


Ho sempre pensato che dichiarando


char *c = "line";

era lo stesso di


char c[] = "line";

e così ho fatto


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

Il che mi dà un tipo di puntatore incompatibile, dove


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

non lo fa. Qualche aiuto per capirlo?


Risposte:


Beh, non sono la stessa cosa. È solo più facile per la maggior parte delle persone pensare a loro come se fossero la stessa cosa, quindi tutti iniziano a pensare in questo modo fino a quando non incontrano un problema come quello sopra :-)


Stavo per scrivere qualcosa di lungo e prolisso, ma poi ho pensato... Qualcun altro deve averlo già fatto. E hanno. Questa è un'ottima spiegazione:


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


Il modo più semplice per pensarci è quando fai qualcosa come:



char *foo = "something";

Stai davvero facendo qualcosa del tipo:



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

Ora... non è proprio un'immagine precisa (anche se non sono un esperto di compilatori). Almeno ti permette di pensare alle cose in un modo leggermente più corretto.


Quindi, torniamo al tuo problema, se io capire le cose bene (che non è mai garantito), non puoi fare la tua riga di esempio n. 3 in C. Hai ragione sul fatto che qualcuno potrebbe scrivere un compilatore che farebbe la cosa giusta qui, ma gcc no. Il quarto esempio, tuttavia, fa la "cosa giusta" e ti fornisce "una matrice di puntatori che puntano ciascuno a una matrice const char".


Una volta mi sono imbattuto in una pagina web che avrebbe tradotto un tipo C complesso in inglese. Probabilmente era nei primi anni '90, ma scommetto che se cerchi abbastanza su Google ti darebbe una descrizione del testo più accurata di quella che ho appena preparato.