In int (*x)[10];
x
è un puntatore a un array di 10 int
sPerché questa dichiarazione non funziona
Allora perché questo codice può essere compilato:
int arr[3] ;
int (*p)[3] =arr;
Ma questo funziona:
int arr[3];
int (*p)[3] =&arr;
In int (*x)[10];
x
è un puntatore a un array di 10 int
sPerché questa dichiarazione non funziona
Allora perché questo codice può essere compilato:
int arr[3] ;
int (*p)[3] =arr;
Ma questo funziona:
int arr[3];
int (*p)[3] =&arr;
arr
è un'espressione che valuta un int*
(questa è la famosa funzione "decodifica array da puntatore" ure).
&arr
è un'espressione che restituisce un valore int (*)[3]
.
I nomi di array "decadono" ai puntatori del primo elemento dell'array in tutte le espressioni tranne quando sono operandi per gli operatori sizeof
o &
. Per queste due operazioni, i nomi degli array mantengono il loro 'arrayness' (C99 6.3.2.1/3 "Lvalues, array e designatori di funzioni").
Non funziona esattamente per la stessa ragione:
int i;
int* pi = i; // error: no conversion from int to int*
+1: Vorrei anche sottolineare che, anche se di tipo diverso, entrambe le espressioni restituiscono lo stesso indirizzo di puntatore. –