W int (*x)[10];
x
jest wskaźnik do tablicy 10 int
sDlaczego ta deklaracja nie działać
Dlaczego więc ten kod nie kompilacji:
int arr[3] ;
int (*p)[3] =arr;
Ale to działa:
int arr[3];
int (*p)[3] =&arr;
W int (*x)[10];
x
jest wskaźnik do tablicy 10 int
sDlaczego ta deklaracja nie działać
Dlaczego więc ten kod nie kompilacji:
int arr[3] ;
int (*p)[3] =arr;
Ale to działa:
int arr[3];
int (*p)[3] =&arr;
arr
jest wyrażeniem, które ocenia się na int*
(jest to słynny wyczyn "tablic zaniku do wskaźnika"; ure).
&arr
to wyrażenie, które ocenia się na int (*)[3]
.
Array nazwy "rozpadu" do wskaźników do pierwszego elementu tablicy we wszystkich wyrażeniach, z wyjątkiem sytuacji, gdy są operandy do operatorów sizeof
lub &
. W przypadku tych dwóch operacji nazwy tablic zachowują swoją "aratraturę" (C99 6.3.2.1/3 "L wartości, tablice i oznaczenia funkcji").
To nie działa dokładnie z tego samego powodu jak:
int i;
int* pi = i; // error: no conversion from int to int*
+1: Chciałbym również podkreślić, że choć innego rodzaju, oba wyrażenia zwracają ten sam wskaźnik adresu. –