Sambanburður á bendum og tilvísunum
Tölvunarfræði 2, vor 2005



Skilgreiningar

Að búa til benda:
    <TAG> *<bendanafn>;
Hér getur <TAG> verið tag eins og int, float, eða notendaskilgreindur klasi. Dæmi:
    int *p;
    CAT *t;

Að búa til tilvísanir:

    <TAG> &<tilvísun> = <breytunafn>;
Hér getur <TAG> verið eins og að ofan. <breytunafn> er skilgreind breyta af sama tagi. Dæmi:
    int &magn = fjoldi;
Nú er magn annað nafn á breytunni fjoldi. Það er hægt að nota bæði nöfnin jöfnum höndum.

Notkun

Eftir að tilvísanir hafa verið skilgreindar þá eru þær bara notaðar sem annað nafn á breytunni sem þær voru festar á.

Tveir virkjar (e. operators) sem tengjast bendum. Til að fá það sem bendar benda á er notaður virkinn "*". Dæmi:

    float *p;		// p er bendir á float
    p = new float;	// p látið benda á nýtt ónefnt float-hólf
    *p = 2.5;		// það sem p bendir á (þ.e. ónefnda hólfið)
    			//  er látið fá gildið 2.5
Hægt er að fá vistföng allra breyta með virkjanum "&". Allar breytur eru geymdar í minni og hafa því vistföng. Getum sett þessi vistföng í bendabreytur:
    int i;		// i er heiltölubreyta
    int *p = &i;	// p er heiltölubendir og er látinn benda á i
    			//  þ.e. vistfangið á i er sett í p
Athugið að bendar eru breytur líka og hafa því vistföng eins og aðrar breytur. Gætum skilgreint "benda á benda á int". Þetta eru bendar sem benda bara á "benda á int" (eða int *). Dæmi:
    int i;
    int *p = &i;
    int **q = &p;	// q er bendir á heiltölubenda og er látinn benda á p
    
    i = 5;		//
    *p = 5;		// Þessar þrjár setningar eru allar jafngildar
    **q = 5;		//
Athugið að vegna þess að tilvísanir eru bara annað nafn á breytu þá hafa bæði nöfnin sama vistfang. Dæmi:
    int fjoldi;
    int &magn = fjoldi;	// magn er annað nafn á fjoldi
    int *p;
    
    p = &fjoldi;	//
    p = &magn;		// Þessar tvær setningar eru alveg jafngildar
Prófið að slá inn dæmið hér að ofan og prenta síðan út &fjoldi og &magn. Þá ætti að koma út sama vistfangið.

Nokkur dæmi

Segjum að p sé bendir á int (þ.e. skilgreindur með: "int *p;"). Skoðum þá merkingar nokkurra setninga:
    *p = a;		// það sem p bendir á er sett sem gildið í a
    			//  a verður að vera af sama tagi og það sem p bendir á, eða int
    			//  gerum líka ráð fyrir því að p bendi á minnishólf sem við megum breyta
    
    *p = &a;		// það sem p bendir á er sett sem vistfangið á a
    			//  Þar sem p er bendir á int og &a er vistfang þá gengur
    			//  þetta ekki (þ.e. vistfang í heiltöluhólf)
    
    p = &a;		// p fær vistfangið á a
    			//  þá verður a að vera int-breyta, því p getur bara bent á
    			//  heiltöluhólf
    
    p = a;		// p fær gildið í a
    			//  þá verður a að vera heiltölubendir líka (þ.e. skilgreint
    			//  með "int *a;"

hh (hja) hi.is, janúar, 2005.