2011-06-03 2 views
6

questa è probabilmente una cosa sostanzialmente banale, ma in qualche modo mi sfugge, finora ..incrementare un array di puntatori in C

char * a3[2];
a3[0] = "abc";
a3[1] = "def";
char ** p;
p = a3;

questo funziona:

printf("%p - \"%s\"\n", p, *(++p));

questo non:

printf("%p - \"%s\"\n", a3, *(++a3));

L'errore che sto ottenendo a compilazione è:

lvalue richiesto come operando incremento

Che cosa sto facendo di sbagliato, perché e che cosa è la soluzione per 'A3'?

+0

La variabile a3 è dichiarata come una matrice di caratteri, penso che tu voglia dichiararla come una matrice di puntatori, quindi dovrebbe leggere char * a3 [2] invece di char a3 [2] – David

+0

che è stato un errore di copiare il codice, hai ragione, sì, era un array di puntatori, grazie per averlo indicato – XXL

risposta

4

a3 è un puntatore costante, non è possibile incrementarlo. "p" tuttavia è un puntatore generico all'inizio di a3 che può essere incrementato.

+0

questa sembra essere la risposta più precisa, grazie – XXL

4

Non è possibile assegnare a a3, né è possibile incrementarlo. Il nome dell'array è una costante, non può essere modificato.

c-faq

+0

@XXL Il modo in cui lo hai dichiarato, 'a3' non è un puntatore, punto. Probabilmente ti manca anche un '*' nella tua domanda ('char * a3 [2]'? – cnicutar

+0

mancava un asterisco a causa di una pasta fallita, quello che volevo sentire era che "il nome dell'array è costante, quindi non può essere modificato" - il che lo spiega abbastanza bene. non avevi questa parte nella tua risposta originale, come è apparsa solo dopo aver modificato il tuo post - questo è il motivo per cui ho fatto una domanda di follow-up su "perché". ad ogni modo, è stato indirizzato ormai, grazie – XXL

0

Prova

char *a3Ptr = a3; 
printf("%p - \"%s\"\n", a3, *(++a3Ptr)); 

In C, un array di caratteri [] è diverso da char *, anche se è possibile utilizzare un char * per fare riferimento la prima posizione di un array di char.

non sono entrambi puntatori "p" e "a3" ai puntatori?

Sì, ma a3 è costante. Non puoi modificarlo.

0

a3 è un nome di un array. Questo su di esso come un puntatore costante.

Non è possibile modificarlo. È possibile utilizzare a3 + 1 anziché ++a3.

Un altro problema è con l'uso di "%s" per l'argomento *(++a3). Poiché a3 è un array di caratteri, *a3 è un carattere e l'identificatore di formato appropriato deve essere %c.

+0

a3 è una matrice di char * così che la sintassi dovrebbe essere ok ... anch'io l'ho mal interpretato in un primo momento ... o forse è stato modificato dopo aver postato questo. – Pablitorun

0

Non è possibile incrementare o indirizzare alcun array di caratteri in altro dopo la creazione. È necessario modificare o accedere utilizzando l'indice. like a[1]