2013-05-09 8 views
7

Nel seguente codice:* (a ++) sta dando errore ma non * (a + 1) ?? dove a è il nome dell'array?

void main() 
{ 
    char a[]={1,5,3,4,5,6}; 
    printf("%d\n",*(a++)); //line gives error: wrong type argument to increment 
    printf("%d\n",*(a+1)); 
} 

Qual è la differenza tra la linea 4 e la linea 5. Non ricevo alcun errore o avviso con la linea 5.

+1

Non sono bravo in C, ma forse non è possibile incrementare il doppio incremento (cioè gli array di '++' operator). – Voitcus

+9

Completamente fuori tema ma 'void main()' == male! Quando pensi 'void main()', immagina qualcuno che ti schiaffeggia con un bastone. 'int main()', sempre! – Yuushi

risposta

26

a è un oggetto array e non un puntatore in modo non è possibile utilizzare l'operazione a++ per un oggetto array. perché questo equivale a:

a = a+ 1; 

Qui si sta assegnando alla matrice oggetto un nuovo valore che non è consentito in C.

a + 1 ritorno un puntatore all'elemento 1 della vostra a matrice e è consentito

3

'a' si comporta come un puntatore const. 'a' non può modificare il suo valore o l'indirizzo a cui punta. Questo perché il compilatore ha allocato staticamente memoria della dimensione della matrice e si sta modificando l'indirizzo a cui fa riferimento.

Si può fare come segue invece

void main() 
{ 
char a[]={1,5,3,4,5,6}; 
char *ch; 
ch=a; 
printf("%d\n",*(ch++)); //this lines gives error no more 
printf("%d\n",*(ch+1)); 
} 
+0

'a' non è in alcun modo un puntatore const. È un array. –

+1

@ H2CO3 Ho detto 'supponiamo' 'a' di essere un puntatore const. Non l'ho chiamato puntatore const. –

+0

Ma anche questo è sbagliato ... –

4

Ok seriamente cattive pratiche di codifica: però si deve prima risolvere il suo problema:

printf("%d\n",*(a++)); //this lines gives error: wrong type argument to increment 

non può essere utilizzato perché a è un implicito riferimento alla la matrice;

si può fare questo:

char b[]={1,5,3,4,5,6}; 
char *a = b; 
printf("%d\n",*(a++)); //this lines will not give errors any more 

e il gioco è fatto ...

anche *(a++) non è lo stesso di *(a+1) perchè ++ i tentativi di modificare operando mentre + semplicemente aggiungere uno al valore costante a .

+0

Anche 'a ++' valuta il vecchio valore di 'a' e il valore memorizzato di' a' viene incrementato (postincremento) – Joe

Problemi correlati