So etwas ist ziemlich einfach zu überprüfen (a):
#include <stdio.h>
int main (void) {
int a[2][3][4][5];
// Ignore incorrect format specifiers for now.
printf ("%d\n", sizeof(int));
printf ("%d\n", &(a[0][0][0][0]));
printf ("%d\n", &(a[1][1][1][1]));
printf ("%d\n", (int)&(a[1][1][1][1])
- (int)&(a[0][0][0][0])
+ 1000);
return 0;
}
und der Ausgang davon ist:
4
2665056
2665400
1344
Beachten Sie die Umwandlungen der Zeiger auf int
Werte in diesem letzten printf
. Ohne diese würde die 1000
als int *
skaliert werden, was den falschen Wert ergibt.
Also, ja, unterm Strich, Ihre Argumentation ist richtig.
(a) Das ist nicht immer der Fall, da einige Aspekte der Sprache C über Implementierungen unterscheiden können (umsetzungs spezifizierte Verhalten) oder in irgendeiner Weise sie (nicht definiertes Verhalten) wollen.
Erfreulicherweise Layout von Arrays spezifisch durch die Norm in C11 6.5.2.1 Array subscripting
angegeben ist:
2/A Postfix Ausdruck durch einen Ausdruck in eckigen Klammern []
ist eine indizierte Bezeichnung eines Elements eines Arrays Objekt. Die Definition des tiefgestellten Operators []
ist, dass E1[E2]
identisch mit (*((E1)+(E2)))
ist. Aufgrund der Konvertierungsregeln, die auf den binären +
Operator anzuwenden, wenn E1
ist ein Array-Objekt (äquivalent, ein Zeiger auf das Anfangs-Element eines Arrays Objekts) und E2
eine ganze Zahl ist, E1[E2]
bezeichnet das E2-th
Element E1
(Zählung von Null).
3/Aufeinanderfolgende Subskriptoperatoren bezeichnen ein Element eines mehrdimensionalen Array-Objekts. Wenn E
ein n-dimensionales Array (n> = 2) mit den Dimensionen i * j * ... * k
ist, wird E
(anders als ein lvalue verwendet) in einen Zeiger auf ein (n - 1) -dimensionales Array mit den Dimensionen j * ... * k
konvertiert.Wenn der unäre Operator *
auf diesen Zeiger explizit oder implizit als Ergebnis von Subskriptionen angewendet wird, ist das Ergebnis das referenzierte (n - 1) -dimensionale Array, das selbst in einen Zeiger konvertiert wird, wenn es anders als ein Lvalue verwendet wird. Daraus folgt, dass Arrays in Reihe-Haupt-Reihenfolge gespeichert werden (letzter Index variiert am schnellsten).
Hört sich gut an. – JS1