2015-10-19 8 views
5

Ho appena trovato un po 'di confusione mentre utilizzavo l'operatore di incremento nella serie di puntatori.Cosa c'è di sbagliato con l'operatore di incremento nella serie di puntatori?

Codice 1:

int main(void) { 
    char *array[] = {"howdy", "mani"}; 
    printf("%s", *(++array)); 
    return 0; 
} 

Durante la compilazione, gcc genera un errore ben noto "lvalue richiesto come operando di incremento".

Ma quando compilo il codice qui sotto non mostra errori !!! Perché?

Code2:

int main(int argc, char *argv[]) { 
    printf("%s",*(++argv)); 
    return 0; 
} 

In entrambi i casi, sono stato incrementare una matrice di puntatore. Quindi, dovrebbe essere fatto in questo modo.

char *array[] = {"howdy","mani"}; 
char **pointer = array; 
printf("%s",*(++pointer)); 

Ma perché codice2 non mostra errori?

+1

Molto interessante! La mia ipotesi è che considera 'char * argv []' equivalente a 'char ** argv' ma non così con un puntatore definito dall'utente all'array .. – Claudiu

+7

Una variabile locale' char * array [] 'è una matrice di puntatori . Un argomento di funzione 'char * argv []' è in realtà un 'char ** argv'. Norma di bozza C11 '6.7.6.3 Dichiaratori di funzione (compresi i prototipi), Sezione 7 Una dichiarazione di un parametro come '' array of type '' deve essere adattata a '' pointer qualificato per digitare '' [...]'. – EOF

+2

'char * argv []' passato a 'main()' decade in 'char **', non così con il tuo uso diretto di '* array []' in 'main()' –

risposta

5

Le matrici non possono essere incrementate.

Nel primo esempio di codice si tenta di incrementare un array. Nel secondo esempio di codice si tenta di incrementare un puntatore.

Il motivo per cui ci si sveglia è che quando un dichiaratore di array viene visualizzato in un elenco di parametri funzione, viene effettivamente regolato come un dichiaratore di puntatore. (Questo è diverso dal decadimento del puntatore dell'array). Nel secondo frammento, char *argv[] significa in realtà char **argv.

See this thread per una discussione simile.