ProgrammatieEmbedded ontwikkelaar

Wat is een array van pointers in de programmeertaal C en hoe verschilt dit van een pointer naar een array? Hoe moet je elk van deze typen correct declareren en gebruiken?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

Array van pointers — een structuur waarin elk element een pointer is, meestal naar hetzelfde type. Het wordt bijvoorbeeld gebruikt voor het opslaan van een lijst met strings (char *arr[];).

Pointer naar een array — een variabele die het adres van het begin van de gehele array opslaat (bijvoorbeeld int (*ptr)[10]; wijst naar een array van 10 elementen van het type int).

Voorbeelden:

// Array van pointers naar char (array van strings) char *days[] = {"Sun", "Mon", "Tue"}; // Pointer naar een array van 10 gehele getallen int arr[10]; int (*p)[10] = &arr; // Toegang: printf("%s", days[1]); // "Mon" printf("%d", (*p)[0]); // arr[0]

Vragend met een valstrik

"Wat is het verschil tussen char *arr[3]; en char (*arr)[3]; en hoe moet je correct naar strings verwijzen in elk geval?"

Velen denken dat er geen verschil is of dat dit gewoon synoniemen zijn.

Correct antwoord:

  • char *arr[3]; — array van 3 pointers naar char (meestal array van strings).
  • char (*arr)[3]; — pointer naar een array van 3 char (pointer naar een enkele string van lengte 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

Voorbeelden van echte fouten door gebrek aan kennis van de nuances van het onderwerp


Verhaal 1

In een project hebben ze een array van strings voor een menu opgezet, maar schreven char menu[5][30]; Verkeerd doorgegeven aan de functie als parameter char *menu, waardoor de functies alleen met de eerste string werkten, terwijl de andere vervormd raakten of het programma crashte.


Verhaal 2

Ze probeerden een array van pointers naar arrays te maken: int *arr[10]; geïnitialiseerd via loops, maar in werkelijkheid slaagden ze er niet in om pointers naar lokale arrays op te slaan, wat UB veroorzaakte bij toegang.


Verhaal 3

In de implementatie van de FIFO-queue voor buffers verwisselden ze waar ze het adres van de volledige queue moesten nemen (pointer naar de array) en waar ze het element moesten nemen (array van pointers naar blokken). Hierdoor waren de verschuivingen van pointers onjuist — gegevens gingen verloren.