Archief - [PROG]C++ C++ verschil pointer / alias

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

KULeest

Legacy Member
Hallo,

Ik vroeg me af wat nu het verschil is tussen een pointer en een alias in C++

bv

int *p = ...
en
int &p = ...

alvast bedankt

Darth-Falcon

Legacy Member
volgend vb maakt het misschien een beke duidelijk.

(in main)
...
int test;
a(&test);
...

void (int *t)
{
*p = 5;
}

met &p wordt het adress van de variable waar naar wordt verwezen opgeslagen in de pointer.
*p is ofwel in de declaratie aanduiden dat het om een pointer gaat.
ofwel verwijst *p naar de waarde van de variable waarnaar verwezen

KULeest

Legacy Member
Darth-Falcon zei:
volgend vb maakt het misschien een beke duidelijk.

(in main)
...
int test;
a(&test);
...

void (int *t)
{
*p = 5;
}

met &p wordt het adress van de variable waar naar wordt verwezen opgeslagen in de pointer.
*p is ofwel in de declaratie aanduiden dat het om een pointer gaat.
ofwel verwijst *p naar de waarde van de variable waarnaar verwezen

Ja dat versta ik, maar ik vraag me bv af wat het verschil is tussen dit:

vb:

Account ac;
Account &abc = ac; // nu is abc een alias voor ac

Maar wat is het verschil dan bv met:

Account ac;
Account *abc = ∾

of is dit laatste niet gelijk aan het vorige stuk code of waar zit het vershil?

killgore

Legacy Member
KULeest zei:
Ja dat versta ik, maar ik vraag me bv af wat het verschil is tussen dit:

vb:

Account ac;
Account &abc = ac; // nu is abc een alias voor ac

Maar wat is het verschil dan bv met:

Account ac;
Account *abc = ∾

of is dit laatste niet gelijk aan het vorige stuk code of waar zit het vershil?
een reference variabele is in se een gewone variabele, dus in uw eerste stuk code is abc gewoon een Account-variabele, alleen is haar inhoud dezelfde als die van ac, dus als je ac aanpast, dan wijzig je ook abc en omgekeerd, voor de rest zijn het gewone variabelen.

Een pointer is op zich geen gewone variabele, maar een variabele die een geheugenadres bijhoudt. Een pointer zelf is dus meestal maar 32 (of tegenwoordig 64) bits lang :), ook al kan hij het adres bijhouden van een variabele die theoretisch meerdere mb's kan innemen (daarom dat je moet specifiëren naar WAT de pointer wijst, hij moet weten hoe ver in het geheugen er moet gelezen worden).
In die pointer sla je dan een geheugenadres op. Je kan dit (niet aan te raden) rechtstreeks doen, of je kan een geheugenadres gebruiken dat de operator new je leverft, of je kan een geheugenadres gebruiken van een bestaande variabele, zoals je in voorbeeld 2 doet.
In voorbeeld 2 heb je dus aan abc een adres toegekend. Met dit adres kan je verderwerken, je kan rechtstreeks op het adres werken (wt ik nu niet zal uitleggen of je wordt zot) en je kan de waarde ophalen die met dit adres overeenkomt, dit doe je met behulp van de operator *. Merk op dat je hier dus *abc moet gebruiken voor de waarde aan te spreken, waar je in je eerste stuk code gewoon met abc kan werken ;)!

Daedie

Legacy Member
pointer: Bij een pointer gaat ge een stukje geheugen vrijmaken waarin het geheugenadres van een bepaalde waarde wordt in opgeslaan.
Je kan dit geheugenplekje opvragen door gewoon de naam te geven (bv. printfunctie( a ) ). De waarde opgeslagen in dit geheugenplekje spreek je aan door middel van indirectie ( printfuntie (*a) ).
bv.

int b = 10;
int *a;
a = &b; a krijgt als waarde het adres waarin het getal 10 met als benaming b is opgeslaan in het geheugen.

Met een alias ga je aan een stukje geheugen eigenlijk een 2de naam (letterlijke vertaling van alias) verbinden. Hierbij is dan ook geen indirectie nodig bij het gebruiken van de gegevens.

bv.
int a = 8;
int &b;
b = a;

dit lijkt sterk op een gewone declaratie en initialisatie van waarden. met het verschil dat als je in dit geval (met alias) de geheugenplaatsen gaat opvragen van a en b (&a, &b), je 2 keer dezelfde waarde krijgt. waarbij je bij een gewone declaratie en initialisiatie 2 verschillende waarden zal krijgen.

het nut van een alias: Vooral handig bij grote structuren. Als je ze gewoon declareert en meegeeft aan een andere variable, dan ga je telkens al de gegevens overkopiëren naar een nieuw stuk geheugen (ook bij het doorgeven aan een functie worden deze gegevens gekopieerd). Met een alias geef je gewoon een 2de naam aan dezelfde gegevens, zo bespaar je je geheugen :).

Ik hoop dat het een beetje duidelijk is uitgelegd.

Vich

Legacy Member
Even offtopic, maar euh: een "alias"? Noemen ze dat op school zo?
Dat zijn gewoon references(of als het moet: referenties)!

Daedie

Legacy Member
Vich zei:
Even offtopic, maar euh: een "alias"? Noemen ze dat op school zo?
Dat zijn gewoon references(of als het moet: referenties)!

In ons boek worden de termen reference (variabelen) en alias beiden gehanteerd. Dan zal het niet fout zijn he ;).

2de bachelor informatica (unief).

Vich

Legacy Member
HC_Daedalus zei:
In ons boek worden de termen reference (variabelen) en alias beiden gehanteerd. Dan zal het niet fout zijn he ;).

2de bachelor informatica (unief).

Een boek dat willekeurig 2 termen gebruikt voor hetzelfde begrip is naar mijn mening geen goed boek ;) Zoiets schept alleen maar onnodige verwarring.
Iedereen mag het noemen zoals hij wil, maar als je later iets gaat uitleggen aan een andertalige collega en je noemt het een "alias"(Engels), dan gaat die je echt niet begrijpen.

[BAT] Hydra

Legacy Member
Vich zei:
Even offtopic, maar euh: een "alias"? Noemen ze dat op school zo?
Dat zijn gewoon references(of als het moet: referenties)!

....
Person& john = jack;
....

john is nu een alias voor jack, klinkt/voelt toch normaal aan, niet? :oink:

En ja, bij ons aan de KUL zeggen ze daar ook 'alias' tegen.

kwitters

Legacy Member
Vich zei:
Iedereen mag het noemen zoals hij wil, maar als je later iets gaat uitleggen aan een andertalige collega en je noemt het een "alias"(Engels), dan gaat die je echt niet begrijpen.

Als ik mag aanvullen: iedereen mag het noemen zoals hij wil, maar in C++ noemt men zoiets een "reference". En inderdaad, als er geen "pointer" had bijgestaan had ik ook niet geweten wat een "alias" was.
Spreekt men in dat boek ook over "pass-by-alias"? :rofl:

killgore

Legacy Member
Vich zei:
Een boek dat willekeurig 2 termen gebruikt voor hetzelfde begrip is naar mijn mening geen goed boek ;) Zoiets schept alleen maar onnodige verwarring.
Iedereen mag het noemen zoals hij wil, maar als je later iets gaat uitleggen aan een andertalige collega en je noemt het een "alias"(Engels), dan gaat die je echt niet begrijpen.
Wij krijgen in sommige vakken toch ook de 2 woorden ze: engels en nederlands. Het is immers maar belachelijk als je een nederlandse tekst vol met engelse termen moet gooien.

Als ge al niet in staat zijt de 2 te onthouden :/.

Daedie

Legacy Member
Vich zei:
Een boek dat willekeurig 2 termen gebruikt voor hetzelfde begrip is naar mijn mening geen goed boek ;) Zoiets schept alleen maar onnodige verwarring.
Iedereen mag het noemen zoals hij wil, maar als je later iets gaat uitleggen aan een andertalige collega en je noemt het een "alias"(Engels), dan gaat die je echt niet begrijpen.

Ik heb nergens beweerd dat de 2 termen willekeurig worden aangehaald. Integendeel, wordt juist netjes in de context uitgelegd. Het was mij (en mijn collega's) toch vrij duidelijk wat er bedoeld werd. Zelf verkies ik ook de term reference variable. Omdat ik ook liever zo veel mogelijk internationaal "spreek" (op het vlak van programmeren dan). maar aangezien de threadstarter sprak over alias, heb ik hem vooruit geholpen met de term die hij verkoos :).

EagleEye

Legacy Member
Bij ons (Universiteit Antwerpen, 2e bach Informatica) worden ook de termen Alias en Reference gebruikt.

Code:
aliasen: meerdere variabelen die naar dezelfde geheugenlocatie verwijzen
Code:
referentie: een alternatieve naam voor eenzelfde object

niet hélemaal hetzelfde woord, hoewel ze natuurlijk wel hetzelfde ding bedoelen :)

er kan natuurlijk wat verwarring ontstaan want als Stroustrup het over een Alias heeft gaat het over namespace aliases
Code:
namespacename:
originalnamespacename
namespacealias

namespacealias:
identifier
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan