Hier habe ich einen Zeiger ptr
auf ein Array arr
von 4 ganzen Zahlen. ptr
zeigt auf das gesamte Array. ptr[0]
oder *ptr
zeigt auf das erste Element des Arrays. Wenn Sie also 1 hinzufügen, erhalten Sie ptr[0]
die Adresse des zweiten Elements des Arrays.
Ich kann nicht verstehen, warum using sizeof(ptr[0])
die Größe des gesamten Arrays angibt, 16 Bytes, nicht die Größe nur des ersten Elements, 4 Bytes (als ptr[0]
Punkte auf das erste Element im Array).
int arr[4] = {0, 1, 2, 3};
int (*ptr)[4] = &arr;
printf("%zd", sizeof(ptr[0])); //output is 16
int *ptr = arr;
? Das würde dazu führen, dass es auf den Start (das erste Element) des Arrays zeigt, was äquivalent zu ist&arr[0]
.int *ptr = arr;
? Nicht wirklich.int (*ptr)[4]
Erstelltptr
als Zeiger auf ein vollständiges Array von vierint
Werten. Eine solche Zeigersyntax ist erforderlich, um echte mehrdimensionale Arrays dynamisch zuzuweisen. Die "zweidimensionalen Arrays", die mit verschachteltenmalloc()
Schleifen erstellt und fälschlicherweise als mehrdimensionale Arrays beschrieben werden, sind tatsächlich 1-d-Arrays von Zeigern auf mehrere 1-d-Arrays. Siehe stackoverflow.com/questions/42094465/…Antworten:
Typ Verwirrung.
ptr[0]
ist ein Array.ptr
ist ein Zeiger auf Array 4 von int .ptr[0]
, wie*ptr
der Zeiger auf ein Array verzögert .sizeof(ptr[0])
ist die Größe eines Arrays.Mit
sizeof(ptr[0])
,ptr[0]
nicht incur „ein Ausdruck mit Typ‚‘Zeiger auf Typen‚‘ , dass die Punkte auf das Anfangselement der Arrays Objekt“ Konvertierung. (c11dr §6.3.2.1 3). Mitsizeof
,ptr[0]
ist ein Array.quelle
&ptr[0][0]
hatint *
Typptr[0]
(implizit konvertiert inint *
) würde die Adresse des ersten int-Elements auswerten.printf("someforamt", ptr[0] , ptr[0]+1)
macht etwas anderes alssizeof(ptr[0])
. Dasptr[0]
durchläuft im ersten Fall eine implizite Konvertierung. Mitsizeof(ptr[0])
,ptr[0]
nicht.ptr
Hier ist vom Typpointer to an array of 4 int elements
und der Array-Typ hat auf Ihrer Plattform die Größe 16 (sizeof (int) * (Anzahl der Elemente)).weil das System vom Typ C Array-Typen hat. Hier beides
arr
und*ptr
hat es. Was Sie erklären, dass Sie haben. Um hier sizeof int zu erhalten, sollten Sie sizeof (ptr [0] [0]) verwenden - wobei ptr [0] als Array ausgewertet wird.quelle
mit haben
int (*ptr)[4] = &arr ;
Sie einen Zeiger auf ein Array von vier ganzen Zahlen und zeigen auf arr.ptr
zeigt jetzt aufarr
, wie ein Doppelzeiger. Wir können Elemente zugreifenarr
verwenden ,ptr[0][x]
wox
sein könnte0
zu4
.So
sizeof(ptr[0])
ist das gleiche wiesizeof(arr)
quelle
Per Definition
ptr[0]
ist das gleiche wie*(ptr + 0)
was wiederum dasselbe ist wie*ptr
. Weiterptr
wird mit initialisiert&arr
, so*ptr
ist*&arr
und das ist gerechtarr
. Man beachte , dass die Zwischenspeicherung von&arr
inptr
sich nicht jeden Array Zerfall durchführt, so dass die Äquivalenz aufrechterhalten wird und keine Typinformationen verloren.Beachten Sie, dass dies alles zur Kompilierungszeit berechnet wird, um diese zusätzliche Gefahr zu vermeiden.
quelle