Um dies vollständig zu verstehen, müssen Sie die folgenden Konzepte verstehen :
Arrays sind keine Zeiger!
Erstens (und es wurde genug gepredigt) sind Arrays keine Zeiger . Stattdessen "zerfallen" sie in den meisten Fällen in die Adresse ihres ersten Elements, das einem Zeiger zugewiesen werden kann:
int a[] = {1, 2, 3};
int *p = a; // p now points to a[0]
Ich gehe davon aus, dass es so funktioniert, dass auf den Inhalt des Arrays zugegriffen werden kann, ohne alle zu kopieren. Das ist nur ein Verhalten von Array-Typen und soll nicht bedeuten, dass sie dasselbe sind.
Mehrdimensionale Arrays
Mehrdimensionale Arrays sind nur eine Möglichkeit, den Speicher so zu partitionieren, dass der Compiler / die Maschine ihn verstehen und bearbeiten kann.
Zum Beispiel int a[4][3][5]= ein Array, das 4 * 3 * 5 (60) 'Chunks' von ganzzahligem Speicher enthält.
Der Vorteil gegenüber der Verwendung von int a[4][3][5]vs plain int b[60]besteht darin, dass sie jetzt "partitioniert" sind (bei Bedarf einfacher mit ihren "Chunks" zu arbeiten) und das Programm nun gebundene Überprüfungen durchführen kann.
Tatsächlich int a[4][3][5]wird genau wie int b[60]im Speicher gespeichert - Der einzige Unterschied besteht darin, dass das Programm es jetzt so verwaltet, als ob es sich um separate Entitäten bestimmter Größen handelt (insbesondere vier Gruppen zu drei Gruppen zu je fünf).
Denken Sie daran: Beide int a[4][3][5]und int b[60]sind im Speicher gleich, und der einzige Unterschied besteht darin, wie sie von der Anwendung / dem Compiler behandelt werden
{
{1, 2, 3, 4, 5}
{6, 7, 8, 9, 10}
{11, 12, 13, 14, 15}
}
{
{16, 17, 18, 19, 20}
{21, 22, 23, 24, 25}
{26, 27, 28, 29, 30}
}
{
{31, 32, 33, 34, 35}
{36, 37, 38, 39, 40}
{41, 42, 43, 44, 45}
}
{
{46, 47, 48, 49, 50}
{51, 52, 53, 54, 55}
{56, 57, 58, 59, 60}
}
Daraus können Sie deutlich erkennen, dass jede "Partition" nur ein Array ist, das das Programm verfolgt.
Syntax
Jetzt unterscheiden sich Arrays syntaktisch von Zeigern . Dies bedeutet insbesondere, dass der Compiler / die Maschine sie unterschiedlich behandelt. Dies mag wie ein Kinderspiel erscheinen, aber sehen Sie sich Folgendes an:
int a[3][3];
printf("%p %p", a, a[0]);
Im obigen Beispiel wird dieselbe Speicheradresse zweimal wie folgt gedruckt:
0x7eb5a3b4 0x7eb5a3b4
Einem Zeiger kann jedoch nur einer so direkt zugewiesen werden :
int *p1 = a[0]; // RIGHT !
int *p2 = a; // WRONG !
Warum kann kein a Zeiger zugewiesen werden, kann es aber a[0] ?
Dies ist einfach eine Folge mehrdimensionaler Arrays, und ich werde erklären, warum:
Auf der Ebene von ' a' sehen wir immer noch, dass wir eine andere 'Dimension' haben, auf die wir uns freuen können. Auf der Ebene von ' a[0]' befinden wir uns jedoch bereits in der obersten Dimension, was das Programm betrifft, betrachten wir nur ein normales Array.
Sie fragen sich vielleicht:
Warum ist es wichtig, wenn das Array mehrdimensional ist, um einen Zeiger dafür zu erstellen?
Es ist am besten, so zu denken:
Ein "Zerfall" von einem mehrdimensionalen Array ist nicht nur eine Adresse, sondern eine Adresse mit Partitionsdaten (AKA versteht immer noch, dass die zugrunde liegenden Daten aus anderen Arrays bestehen), die aus Grenzen besteht, die vom Array über die erste Dimension hinaus festgelegt werden.
Diese 'Partitions'-Logik kann nicht innerhalb eines Zeigers existieren, es sei denn, wir geben sie an:
int a[4][5][95][8];
int (*p)[5][95][8];
p = a; // p = *a[0] // p = a+0
Andernfalls geht die Bedeutung der Sortiereigenschaften des Arrays verloren.
Beachten Sie auch die Verwendung von Klammern um *p: int (*p)[5][95][8]- Dies bedeutet, dass wir einen Zeiger mit diesen Grenzen erstellen, nicht ein Array von Zeigern mit diesen Grenzen:int *p[5][95][8]
Fazit
Lassen Sie uns überprüfen:
- Arrays zerfallen in Adressen, wenn sie im verwendeten Kontext keinen anderen Zweck haben
- Mehrdimensionale Arrays sind nur Arrays von Arrays. Daher trägt die "verfallene" Adresse die Last "Ich habe Unterdimensionen".
- Dimensionsdaten können in einem Zeiger nur vorhanden sein, wenn Sie sie ihm geben .
Kurz gesagt: Mehrdimensionale Arrays zerfallen in Adressen, die den Inhalt verstehen können.