Array von Zeigern — eine Struktur, bei der jedes Element einen Zeiger darstellt, normalerweise auf denselben Typ. Wird zum Beispiel verwendet, um eine Liste von Zeichenfolgen zu speichern (char *arr[];).
Zeiger auf ein Array — eine Variable, die die Adresse des Beginns des gesamten Arrays speichert (z. B. int (*ptr)[10]; zeigt auf ein Array mit 10 Elementen vom Typ int).
Beispiele:
// Array von Zeigern auf char (Array von Zeichenfolgen) char *days[] = {"Sun", "Mon", "Tue"}; // Zeiger auf ein Array von 10 Ganzzahlen int arr[10]; int (*p)[10] = &arr; // Zugriff: printf("%s", days[1]); // "Mon" printf("%d", (*p)[0]); // arr[0]
"Wie unterscheiden sich
char *arr[3];undchar (*arr)[3];und wie greift man korrekt auf die Zeichenfolgen in jedem Fall zu?"
Viele glauben, dass es keinen Unterschied gibt oder dass dies einfach Synonyme sind.
Richtige Antwort:
char *arr[3]; — Array von 3 Zeigern auf char (in der Regel ein Array von Zeichenfolgen).char (*arr)[3]; — Zeiger auf ein Array von 3 char (Zeiger auf eine eindimensionale Zeichenfolge der Länge 3).char *arr1[3] = {"a", "bb", "ccc"}; printf("%s", arr1[1]); // bb char str[3] = {'x', 'y', 'z'}; char (*arr2)[3] = &str; printf("%c ", (*arr2)[2]); // z
Geschichte 1
In einem Projekt wurde ein Array von Zeichenfolgen für ein Menü erstellt, aber char menu[5][30]; geschrieben. Es wurde fälschlicherweise als char *menu an eine Funktion übergeben, wodurch die Funktionen nur mit der ersten Zeile arbeiteten und die anderen verzerrt wurden oder das Programm abstürzte.
Geschichte 2
Versuchten, ein Array von Zeigern auf Arrays zu erstellen: int *arr[10]; wurde über Schleifen initialisiert, speicherte jedoch tatsächlich Zeiger auf lokale Arrays, was zu UB beim Zugriff führte.
Geschichte 3
Bei der Implementierung einer FIFO-Warteschlange für Puffer wurde verwechselt, wo die Adresse der gesamten Warteschlange (Zeiger auf ein Array) und wo das Element (Array von Zeigern auf Blöcke) zu holen ist. Dadurch waren die Zeigerverschiebungen inkorrekt — Daten gingen verloren.