Programmeren in C/Arrays en pointers: verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
DimiC88 (overleg | bijdragen)
kGeen bewerkingssamenvatting
Regel 7:
</pre>
Zo is de array ook in het geheugen gerepresenteerd, alle variabelen staan direct achter elkaar en met behulp van een typering weet de compiler hoe groot elk element in de array is. Het eerste element in een array heeft de index nul. Men initialiseert een array met behulp van het volgende statement:
<sourcesyntaxhighlight lang="c">
int data[10];
</syntaxhighlight>
</source>
Met deze statement geef je aan, dat je een array wenst van integers en 10 elementen groot. De compiler reserveert dan 10 * sizeof(int) bytes (het is natuurlijk afhankelijk van de compiler, welke groote een integer heeft, doorgaans is een integer 4 byte op een 32 bits machine) en geeft het geheugenadres van het element met index 0.
Een element uit een array kan benaderd worden door de subscriptnotatie. Tussen vierkante haakjes plaats je de index van het element dat je wil benaderen (gaande van 0 tot en met de grootte - 1). Het volgende voorbeeld illustreert hoe een array gevuld kan worden met het kwadraat van de index:
<sourcesyntaxhighlight lang="c">
int main()
{
Regel 21:
}
}
</syntaxhighlight>
</source>
Van elk type kan op deze manier een array gemaakt worden. C controleert echter niet of u zich houdt aan de grootte van de array, zo zal het statement,
<sourcesyntaxhighlight lang="c">
data[10] = '\0';
</syntaxhighlight>
</source>
prima gecompileerd worden. Dit betekent echter niet dat het programma goed werkt, zo kun je je voorstellen, dat het geheugen er op dat moment zo uit ziet:
 
Regel 60:
 
De hierboven genoemde array is eendimensionaal. Men kan er ook een van twee dimensies of meer dimensies definieren:
<sourcesyntaxhighlight lang="c">
char data[9][10][7];
</syntaxhighlight>
</source>
Deze worden ook wel maps genoemd. Je zou namelijk de analogie van een landkaart kunnen trekken. Arrays kunnen alleen statisch een grootte meekrijgen. Dit betekent, dat het alleen mogelijk is om tijdens het programmeren de grootte van de array te definieren en niet tijdens de uitvoering van het programma:
<sourcesyntaxhighlight lang="c">
// Dit programma zal niet gecompileerd worden
// Arrays dienen statisch te worden geinitialiseerd.
Regel 83:
return 0;
}
</syntaxhighlight>
</source>
 
Dit probleem kan worden opgelost met ingewikkeldere datastructuren, zoals gelinkte lijsten, door gebruik te maken van dynamische geheugenallocatie.
Regel 89:
==Pointers==
Pointers bevatten de adressen waar de 'gepointe' variabele zich bevindt. Als je een variabele declareert, reserveert het programma een adres in het geheugen van de computer. Dit adres wordt vervolgens gebruikt wanneer je een waarde toekent aan de variabele. Dus bij het volgende stukje programma
<sourcesyntaxhighlight lang="c">
int i;
i=3;
</syntaxhighlight>
</source>
wordt bij "int i;" een stukje geheugen van sizeof(int) (4) bytes gereserveerd op bv. adres 10000, omdat het hierbij gaat om een integer zullen de bytes 10000 tot en met 10003 worden gereserveerd. Dit adres is te achterhalen door middel van het & teken. Als je zegt "printf("i=%d en staat op adres %d", i, &i);" , krijg je als output: i=3 en staat op adres 10000.
Als je hetzelfde zou doen voor een array, krijg je dat er opeenvolgend geheugenplaatsen worden gereserveerd ter grootte van het type variablele dat je declareert.
<sourcesyntaxhighlight lang="c">int i[10];</sourcesyntaxhighlight>
reserveert in het geheugen 10 * 4 bytes = 40 bytes ruimte voor 10 integers.
Deze geheugenplaatsen kun je vervolgens benaderen op de volgende manier:
 
<sourcesyntaxhighlight lang=c>
int i[10];
for(int n=0;n<10;n++){
i[n]=100+n;
}
</syntaxhighlight>
</source>
<!--niet correct
Met behulp van pointers gaat het ook op de volgende manier:
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.