C macht Arrays und Zeiger untrennbar. Sie können keinen effektiven Code schreiben, ohne ihre Beziehung zu verstehen. Es braucht Zeit, es zu meistern. Der Vorteil ist die sofortige Kontrolle über das Gedächtnis.
Betrachten Sie eine Grundkonfiguration. Sie deklarieren zwei ganzzahlige Arrays der Größe zehn.
„c
int main() { Kompilieren Sie dies. Es scheitert. Sie können ein Array nicht mithilfe des Gleichheitszeichens einem anderen zuweisen. C unterstützt kein Massenkopieren über Zuweisungsoperatoren. Um a nach b zu kopieren, müssen Sie jedes Element durchlaufen. „c Sie könnten diese Schleife mit einem Kommaoperator in eine einzelne Zeile komprimieren, aber die Lesbarkeit leidet. Der Standardansatz besteht darin, memcpy aus string.h zu verwenden. Es verarbeitet das Kopieren auf Byte-Ebene effizient. Das Scheitern von „b=a“ offenbart eine Grundregel. In C sind Array-Variablen keine Arrays. Es handelt sich um feste Zeiger. a und b sind permanente Kennungen für die Startadresse ihrer jeweiligen Speicherblöcke. a zeigt auf „a[0]“. b zeigt auf „b[0]“. Diese Adressen sind unveränderlich. Sie können einen Variablennamen nicht an einen anderen Speicherort umleiten. Deshalb schlägt die Zuordnung fehl. Der Compiler behandelt den Array-Namen als konstanten Zeiger. Da der Name praktisch ein Zeiger ist, können Sie Zeigerarithmetik verwenden, um auf Daten zuzugreifen. Hier wird die Syntax mächtig. „c void main() { Hier ist p eine Zeigervariable. Sie können die Adresse des Arrays a bis p zuweisen. Die Anweisung „p=a“ kopiert die Adresse. Jetzt enthält p denselben Wert wie der Array-Name a. Durch die Dereferenzierung von p mit „*p“ wird das erste Element abgerufen. Die Ausgabe ist Null. Diese Unterscheidung ist wichtig, da Zeigervariablen geändert werden können. Mithilfe von Arithmetik können Sie p auf „a[1]“ oder „a[5]“ zeigen lassen. Der Array-Name selbst bleibt am Anfang hängen. Diese Flexibilität ermöglicht es Funktionen, den Speicher zu durchlaufen, ohne große Datenstrukturen zu kopieren. Es ist das Rückgrat der Low-Level-Leistung in C. Das Verständnis dieses Links verhindert subtile Fehler. Es erklärt, warum einige Funktionen Zeiger anstelle der Array-Syntax akzeptieren. Es verdeutlicht das Speicherlayout. Ignorieren Sie es, und Sie werden mit Segmentierungsfehlern oder unbeabsichtigten Datenüberschreibungen zu kämpfen haben. Lernen Sie es und Sie sehen genau, was die Maschine tut. Die Syntax könnte sich zunächst unnatürlich anfühlen. Die Doppelbedeutung von Klammern und Sternchen verwirrt Anfänger. Aber sobald das Modell klickt, verschwindet die Abstraktion. Übrig bleiben Ihnen Adressen und Werte. Mehr nicht. Lohnt sich die mentale Anstrengung? Der Code wird schneller. Die Speichernutzung sinkt. Sie erhalten direkten Zugriff auf Vorgänge auf Hardwareebene. Die meisten C-Programme verlassen sich darauf Sie können eine Array-Variable direkt einem Zeiger zuweisen, da sie im Grunde genommen dasselbe sind. p=a; funktioniert nicht aufgrund von Magie, sondern weil a in einen Zeiger zerfällt. Konkret zeigt es auf die Speicheradresse des ersten Elements des Arrays (Index 0). Da dieses Element eine Ganzzahl ist, fungiert a als Zeiger auf eine einzelne Ganzzahl. Wenn man p als ganzzahligen Zeiger deklariert und ihn auf a setzt, lässt man lediglich zu, dass zwei Variablen dieselbe Adresse haben. Sie könnten stattdessen p=&a[0]; schreiben. Das Ergebnis ist identisch. Sobald p an den Anfang von a angeschlossen ist, gewinnen Sie an Mobilität. Array-Namen wie a sind Konstanten; Es handelt sich um feste Adressen, die sich nicht ändern können. Zeiger wie p sind unterschiedlich. Sie können sie mithilfe der Zeigerarithmetik verschieben. Hier wird C schlau. Wenn Sie p++; schreiben, fügt der Compiler nicht nur ein Byte zur Adresse hinzu. Es weiß, dass p auf eine Ganzzahl zeigt. Es fügt stattdessen „sizeof(int)“-Bytes hinzu und landet genau beim nächsten Element. Wenn p auf eine Struktur mit einer Länge von 100 Bytes zeigen würde, würde p++ 100 Bytes vorwärts springen. C übernimmt die Mathematik. Sie bewegen einfach den Zeiger. Mithilfe dieser Zeiger können Sie ein Array in ein anderes kopieren. Anstelle einer Standardschleife mit Indizes: „c Sie können Zeiger verwenden: „c Es ist ausführlich. Sie können es komprimieren. „c Oder komprimieren Sie es in einer einzigen Zeile. „c Der Bediener hat hier Vorrang beim schweren Heben. „“ hat eine höhere Priorität als „++“, aber die Nacherhöhung erfolgt nachdem der Wert abgerufen wurde. „ p++“ ruft also den aktuellen Wert ab und bewegt dann den Zeiger. „*q++“ macht dasselbe für das Ziel. Die Zuordnung erfolgt dazwischen. Es ist kompakt. Es ist schnell. Es kann auch leicht zu Fehlinterpretationen kommen, wenn man nicht aufpasst. Was passiert, wenn Sie p oder q über das Ende des Arrays hinausschieben? C hält dich nicht auf. Der Compiler geht davon aus, dass Sie wissen, was Sie tun. Die Zeiger werden weiter erhöht und Daten in den Speicher kopiert, die nicht zum Array gehören. Möglicherweise überschreiben Sie andere Variablen. Sie könnten den Stapel beschädigen. Es kann sein, dass das Programm später an einer Stelle abstürzt, die nichts mit dem Fehler zu tun hat. Aus diesem Grund erfolgt die Überprüfung der Grenzen in C manuell. Die Sprache vertraut Ihnen. Wenn Sie aus der Reihe tanzen, zahlen Sie den Preis. Sie können Arrays auf zwei Arten an Funktionen übergeben. Sie sehen anders aus, verhalten sich aber ähnlich. Betrachten Sie eine Funktion, die ein Array druckt: „c Oder die Zeigerversion: „c Der Parameter „nia“ (Zahl im Array) ist obligatorisch. Arrays in C tragen ihre Größe nicht mit sich. Die Funktion muss wissen, wann sie anhalten muss. In beiden Fällen übergeben Sie einen Zeiger auf den Anfang des Arrays, nicht
int a[MAX];
int b[MAX];
int i;
for(i=0; i
for (i=0; i
int a[MAX];
int i;
int p;
p=a;
for(i=0; i
}
„ 
Arrays ohne Indizes kopieren
für (i=0; i
p=a;
q=b;
für (i=0; i
q++;
p++;
}
„
p=a;
q=b;
für (i=0; i
„
für (p=a, q=b, i=0; i
„ Die Gefahrenzone
Arrays an Funktionen übergeben
void dump(int a[], int nia) {
int i;
für (i=0; i
void dump(int p, int nia) {
int i;
für (i=0; i
}
„





































