Der Typ des Objekts, auf den der Zeiger wie
erklärt
int (*pointer_name)[5] = &array_name;
int[5]
ist. Dies bedeutet beispielsweise, dass dieser Operator
sizeof(*pointer_name)
den Wert gleich 5 * sizeof(int)
ergibt. Und wenn die Zeigerarithmetik zum Beispiel pointer_name + 1
verwendet wird, ist die durch diesen Ausdruck erhaltene Adresse gleich der Adresse, die in dem Zeigerpluswert von 5 * sizeof(int)
gespeichert ist.
Der Typ des Objekts, auf den der Zeiger wie
erklärt
int *pointer_name = array_name;
int
ist. Dies bedeutet beispielsweise, dass dieser Operator
sizeof(*pointer_name)
den Wert gleich sizeof(int)
ergibt. Und wenn die Zeigerarithmetik beispielsweise pointer_name + 1
verwenden soll, dann ist die durch diesen Ausdruck erhaltene Adresse gleich der Adresse, die in dem Zeiger plus Wert von sizeof(int)
gespeichert ist.
Ein Zeiger erklärte wie diese
int (*pointer_name)[5];
Regel für zweidimensionalen Arrays verwendet, die auf „Zeilen“ des Arrays zeigt.
Zum Beispiel
int array_name[2][5];
int (*pointer_name)[5] = array_name;
// outputs 20 provided that sizeof(int) is equal to 4
printf("%zu\n", sizeof(*pointer_name));
// outputs 4 provided that sizeof(int) is equal to 4
printf("%zu\n", sizeof(**pointer_name));
pointer_name
zeigt auf die erste Zeile des Arrays array_name
. pointer_name + 1
zeigt auf die zweite Zeile des Arrays.
"Ich habe gelernt, dass der Name des Arrays tatsächlich die Adresse von array_name [0]" ist. Du hast falsch gelernt. Der Array-Name kann in bestimmten Kontexten, aber nicht in allen Kontexten, als * (* so tun, als sei er *) ein Zeiger auf 'array_name [0]' sein. Und Sie können definitiv nicht sagen, dass der Name des Arrays * die Adresse von 'array_name [0]' ist. – AnT