Tutaj mam wskaźnik ptr
do tablicy arr
4 liczb całkowitych. ptr
wskazuje na całą tablicę. ptr[0]
lub *ptr
wskazuje pierwszy element tablicy, więc dodanie 1 ptr[0]
daje adres drugiego elementu tablicy.
Nie rozumiem, dlaczego użycie sizeof(ptr[0])
daje rozmiar całej tablicy, 16 bajtów, a nie rozmiar tylko pierwszego elementu, 4 bajty (jak ptr[0]
wskazuje na pierwszy element w tablicy).
int arr[4] = {0, 1, 2, 3};
int (*ptr)[4] = &arr;
printf("%zd", sizeof(ptr[0])); //output is 16
int *ptr = arr;
? To wskazywałoby na początek (pierwszy element) tablicy, który jest równoważny&arr[0]
.int *ptr = arr;
? Właściwie nie.int (*ptr)[4]
tworzyptr
jako wskaźnik do pełnej tablicy czterechint
wartości. Taka składnia wskaźnika jest niezbędna do dynamicznego przydzielania prawdziwych wielowymiarowych tablic. „Tablice 2-wymiarowe” utworzone za pomocą zagnieżdżonychmalloc()
pętli i błędnie opisane jako tablice wielowymiarowe są tak naprawdę tablicami jednowymiarowymi wskaźników do wielu tablic jednowymiarowych . Zobacz stackoverflow.com/questions/42094465/…Odpowiedzi:
Wpisz zamieszanie.
ptr[0]
jest tablicą.ptr
jest wskaźnikiem do tablicy 4 int .ptr[0]
, podobnie jak*ptr
odwołuje wskaźnik do tablicy .sizeof(ptr[0])
to rozmiar tablicy.Dzięki
sizeof(ptr[0])
,ptr[0]
nie ponieść „wyrażenia typu«»wskaźnik do typu«», który wskazuje na początkowym elementu obiektu Array” nawrócenia. (c11dr §6.3.2.1 3). Zsizeof
,ptr[0]
jest tablicą.źródło
&ptr[0][0]
jestint *
typuptr[0]
(domyślnie przekonwertowany naint *
) oceniałby adres pierwszego elementu int.printf("someforamt", ptr[0] , ptr[0]+1)
robi coś innego niżsizeof(ptr[0])
. Wptr[0]
pierwszym przypadku następuje niejawna konwersja. Dziękisizeof(ptr[0])
,ptr[0]
nie.ptr
tutaj jest typu,pointer to an array of 4 int elements
a typ tablicy ma rozmiar 16 na twojej platformie (sizeof (int) * (liczba elemetns)).ponieważ system typu C ma typy tablic. Tutaj oba
arr
i*ptr
ma to. Co oświadczasz, że masz. Aby uzyskać sizeof int tutaj powinieneś sizeof (ptr [0] [0]) - gdzie ptr [0] ocenia na tablicę.źródło
z
int (*ptr)[4] = &arr ;
masz wskaźnik do tablicy czterech liczb całkowitych i wskazujący na arr.ptr
wskazuje terazarr
, jak podwójny wskaźnik. Możemy uzyskać dostęp do elementówarr
z użyciemptr[0][x]
gdziex
może być0
do4
.Więc
sizeof(ptr[0])
to samo cosizeof(arr)
źródło
Z definicji
ptr[0]
jest taki sam, jak ten,*(ptr + 0)
który z kolei jest taki sam jak*ptr
. Ponadtoptr
jest inicjowany za pomocą&arr
, tak*ptr
jest*&arr
i to jest sprawiedliwearr
. Należy zauważyć, że pośrednie składowanie&arr
wptr
sposób nie wykonuje żadnej próchnicy tablicy, więc równoważność jest utrzymywany i bez informacji o typie jest stracone.Zauważ, że wszystko to jest obliczane w czasie kompilacji, aby uniknąć tej dodatkowej pułapki.
źródło