Historisch zijn pointers de basis geworden voor geheugenbeheer in de taal C en bieden ze een flexibele manier voor efficiënte toegang tot array-elementen en dynamische structuren. De syntaxis en semantiek van pointers naar arrays en arrays van pointers veroorzaken echter vaak verwarring.
Probleem: beginnende programmeurs verwarren vaak een pointer naar een array (pointer to array) en een array van pointers (array of pointers), wat leidt tot onjuist geheugenbeheer, parameterdoorvoerfouten en moeilijk te construeren syntactische fouten.
Oplossing:
Voorbeeld van declaratie en gebruik:
// Pointer naar een array van 10 int: int (*p)[10]; int arr[10]; p = &arr; // Array van 10 pointers naar int int *ap[10]; for (int i = 0; i < 10; ++i) { ap[i] = &arr[i]; } // Hoe een element op te halen via een pointer naar een array: (*p)[2] = 5; // derde element van arr // Hoe een waarde op te halen met behulp van een array van pointers: *ap[2] = 8; // derde element van arr via ap
Belangrijke kenmerken:
**Zijn int p[10] en int (p)[10] hetzelfde?
Nee. int *p[10] is een array van 10 pointers naar int. int (*p)[10] is een pointer naar een array van 10 int. Grote verwarring ontstaat zonder haakjes!
Voorbeeldcode:
int arr[10]; int *p[10]; // array van pointers int (*q)[10] = &arr; // pointer naar array
*Kun je een gewone pointer naar int vrij toewijzen aan een variabele van type int (p)[10]?
Nee. Een gewone int * wijst naar één element, terwijl int (*p)[10] wijst naar een array van 10 gehele; de types zijn onverenigbaar zonder expliciete casting.
Hoe geef je een tweedimensionale array correct door aan een functie?
Je moet expliciet de grootte van de tweede dimensie opgeven:
void foo(int a[][4], int n); // array van n rijen met 4 elementen
of gebruik een pointer naar een array:
void bar(int (*a)[4], int n);
Een ingenieur declareert een variabele als int *p[10], probeert deze &arr toe te wijzen, waarbij arr = int arr[10] is, en toegang te krijgen als een array, ontvangt een compilatiefout of ongeldige gedrag.
Voordelen:
Nadelen:
Een ontwikkelaar gebruikt zorgvuldig haakjes: int (*p)[10], begrijpt duidelijk het verschil, geeft arrays correct door aan functies, gebruikt typedef voor het vereenvoudigen van declaraties.
Voordelen:
Nadelen: