Wie ein Array von Zeigern in C-Programmierung zu bauen

Ein Array von Zeigern würde eine Anordnung sein, die Speicherplätze enthält. Eine solche Konstruktion ist oft notwendig, in der C Programmiersprache. Denken Sie daran, dass ein Array von Zeigern ist wirklich ein Array von Strings, gezeigt in Verrücktes Pointer-Arrays. Das macht Thema Verdauung erleichtert.

CRAZY POINTER ARRAYS

# include int main () {char * Obst [] = { "Wassermelone", "Banane", "Birne", "Apfel", "Kokosnuss", "Traube", "blueberry"} - int x-for (x = 0-XLT; 7-x ++) puts (Frucht [x]) - return (0) -}

Ein Array von Zeigern in Verrücktes Pointer-Arrays deklariert. Es funktioniert ähnlich wie ein Array von Strings, obwohl in dieser Konstruktion Sie ausdrücklich keine einzelnen String-Längen zählen müssen. Das ist, weil das Array wirklich ein Array von Zeigern ist, oder Speicherplätze. Jeder String wohnt irgendwo im Speicher. Das Array enthält lediglich eine Liste, wo jeder beginnt.

Übung 1: Geben Sie den Quellcode von Crazy Pointer-Arrays in Ihren Editor. Erstellen und ausführen, um zu bestätigen, dass es funktioniert.

Welcher Teil von Crazy Pointer-Arrays denken Sie, könnte verbessert werden?

Übung 2: Unter Verwendung von Informationen unten als Ihr Führer, tauschen Sie die Array-Notation in Zeile 17 in Verrücktes Pointer-Arrays mit der Zeigernotation.

Array alpha []Zeiger ein
alpha [0]*ein
alpha [1]* (A + 1)
alpha [2]* (A + 2)
alpha [3]* (A + 3)
Alpha[n]* (A +n)

Der Grund dafür, dass Ihre Lösung 2 Werke zur Übung (unter der Annahme, dass Sie es richtig, bekam) ist, dass die Frucht Array enthält Zeiger. Der Wert jedes Elements ist ein weiterer Zeiger. Aber das ist nichts- betrachten Pointers-to-Pointers Beispiel.

POINTERS-TO-POINTERS BEISPIEL

# include int main () {char * Obst [] = { "Wassermelone", "Banane", "Birne", "Apfel", "Kokosnuss", "Traube", "blueberry"} - int x-for (x = 0-XLT; 7-x ++) {putchar (** (Obst + x)) - putchar ( ' n') -} return (0) -}

Die Linie 18 in Pointers-to-Pointers Beispiel enthält die gefürchteten, gefürchtet, vermieden und ** Notation verflucht, oder Doppelzeiger Notation.

Übung 3: Geben Sie vorsichtig den Quellcode von Pointers-to-Pointers Beispiel in Ihren Editor. Kompilieren und Ausführen.

Um die ** (Obst + x) verstehen konstruieren, müssen Sie von innen trainieren:

Obst + x

Variable Frucht enthält eine Speicheradresse. Es ist ein Zeiger! Die x ist ein Wert um eine Einheit zu inkrementieren. In diesem Fall ist das Gerät eine Adresse, weil alle Elemente des Frucht Array sind Zeiger.

* (Obst + x)

Sie haben bereits die vorhergehenden Konstruktion gesehen. Es ist der Inhalt der Adresse Obst + x. Aus dem Code, Frucht ist ein Array von Zeigern. So ist das Ergebnis der vorhergehenden Operation ist. . . ein Zeiger!

** (Obst + x)

Schließlich erhalten Sie einen Zeiger auf einen Zeiger oder - besser gesagt - eine peeker zu einem peeker. Wenn der Innen peeker eine Speicheradresse ist, die Außen peeker (das erste Sternchen) ist der Inhalt dieser Speicheradresse.

bild0.jpg

Es hilft, sich daran zu erinnern, dass der ** Betreiber fast immer (aber nicht ausschließlich) gebunden an ein Array von pointers- oder, wenn man es einfach machen wollen, auf ein Array von Strings. Die erste Spalte ist die Adresse eines Array von Zeigern, die zweite Spalte ist der Zeiger selbst (eine Zeichenkette) und die Spalte auf der rechten Seite ist das erste Zeichen des Strings.

Wenn Sie immer noch verwirrt sind, betrachten Notation grübelt über Zeigernotation und Array:

Pointer NotationArray-NotationBeschreibung
** ptr* Array []Erklärt ein Array von Zeigern.
* ptrarray [0]Die Adresse des ersten Zeigers in den Array- für eine string, der ersten Saite.
* (Ptr + 0)array [0]Die gleiche wie die vorangehenden Eintrag.
** ptrarray [0] [0]Das erste Element des ersten Zeigers in den Array- die first der ersten Saite in dem Array.
** (Ptr + 1)Array [1] [0]Das erste Element des zweiten Zeigers in der Array- die first der zweiten Saite.
* (* (Ptr + 1))Array [1] [0]Die gleiche wie die vorangehenden Eintrag.
* (* (Ptr + a) + b)array [a] [b]Element b des Zeigers ein.
** (Ptr + a) + bArray [a] [0] + bDieser Artikel ist nicht wirklich das, was Sie wollen. Was diese itemrepresents ist der Wert des Elements 0 am Zeiger ein Plus theValue variabler b. Verwenden Sie die * (* (ptr + a) + b) notationinstead.

In der Tabelle Zeigernotation (mit variabler ptr) Mit der äquivalenten Array-Notation im Vergleich (mit variabler Feld).

Übung 4: Nacharbeits Ihren Quellcode von Übung 3 so, dass jedes einzelne Zeichen in einer Zeichenkette angezeigt wird, ein zu einer Zeit, die von den putchar () -Funktion. Wenn Sie die gesamte putchar () den Betrieb als eine while-Schleife Zustand schreiben kann, verstehen Sie wirklich das Material.

Menü