UVOD V KAZALCE
Primer programa ------> POINTERS.CPP
Oglejmo si program POINTERS.CPP in si osvežimo osnovne pojme.
Kazalec je tako pri ANSI-C kot pri C++ is deklariran z zvezdico pred imenom spremenljivke. Kazalec je kazalec na spremenljivko nekega specifičnega tipa in naj ga ne bi uporabljali pri spremenljivkah drugih tipov . Tako je pt_int is kazalec na celoštevilčno spremenljivko.
V vrstici 12 je kazalcu pt_int dodeljen naslov spremenljivke pig , vrstica 13 pa uporablja kazalec pt_int za prištevanje vrednosti spremenljivke dog k vrednosti pig, kot to poznamo že od jezika C. Slika 3-1 je grafična ponazoritev podatkovnega prostora po izvedbi vrstice 13. Pravokotniki s piko predstavljajo kazalce. V vrstici 14 uporabimo naslov v kazalcu še za izpis vrednosti spremenljivke pig preko izhodnega tokovnega objekta cout. Podobno je uporabljen kazalec pt_float ki mu je prirejen naslov x.
KONSTANTNI KAZALCI IN KAZALCI NA KONSTANTE
Definicija C++ dopušča tako definicijo kazalca na konstanto, da se vrednost konstante sicer ne more spremeniti, kazalec pa lahko prestavimo na drugo konstanto ali spremenljivko. Definicijo kazalca na konstanto ponazoruje vrstica 22. Lahko pa definiramo tudi konstantni kazalec, ki ga ne moremo spreminjati. Tak kazalec ponazoruje vrstica 23.
Take konstrukte uporabljamo predvsem kot pomoč prevajalniku za izboljšavo kvalitete kodiranega programa .
KAZALEC NA PRAZNO (VOID)
Kazalec na void (prazno) zasledimo v standardu ANSI-C.
Takemu kazalcu lahko dodelimo vrednost kazalca kateregakoli drugega tipa.
V našem primeru imamo kazalec general, ki je tipa void
in ki mu v vrstici 15 dodelimo naslov spremenljivke tipa int,
v vrstici 20 pa naslov spremenljivke tipa float. Vidimo, da lahko
programer s takim kazalcem kaže na različne stvari, kar je uporabno pri
prenosu informacij v programu. Praktičen primer uporabe takega kazalca
je funkcija malloc(), ki vrača kazalec na void. Ta kazalec
lahko naslavlja karkoli in omogoča prenos naslova na kazalec pravilnega
tipa.
DINAMIČNA ALOKACIJA IN DEALOKACIJA
Primer programa ------> NEWDEL.CPP
Program NEWDEL.CPP demonstrira uporabo operatorjev new and delete. Uporaba teh operatorjev je podobna uporabi funkcij malloc() in free() pri programskem jeziku C. Ker sta operatorja new in delete del samega jezika C++, je njuna uporaba bolj učinkovita od uporabe funkcij.
Vrstici 15 in 16 prikazujeta uporabo kazalcev na klasičen C-jevski način, vrstica 17 pa prikazuje uporabo operatorja new. Ta operator dopolnjuje besedica, ki ustreza zahtevanemu tipu podatka ( v našem primeru int). Kazalec point2 kaže na dinamično alocirano celoštevilčno spremenljivko . V vrstici 18 je tej dinamično alocirani spremenljivki dodeljena vrednost 137, naslednji dve vrstici pa to prednost izpišeta na zaslon.
V vrstici 21 alociramo novo spremenljivko in njen naslov vpišemo v kazalec point1. V naslednji vrstici priredimo isti naslov še kazalcu point2. Tako smo zgubili referenco na spremenljivko, ki jo je doslej naslavljal kazalec point2. te spremenljivke ne bomo mogli nikoli več uporabiti niti dealocirati. Taka uporaba kazalcev je torej nevarna. V vrstici je spremenljivka, ki jo naslavlja point1, dealocirana z operatorjem delete, tako odslej kazalca point2 ne moremo več zbrisati, saj ne kaže na nič več.
Operator delete po definiciji ne naredi nič, če navedeni kazalec kaže na vrednost NULL. Z njim lahko brišemo le podatke, ki so bili predhodno alocirani z operatorjen new.
Program vsebuje še nekaj vrstic s spremenljivkami tipa float in kazalci nanje. Zaključuje pa ga primer, ko za operatorjem new napovemo alokacijo bloka določene dolžine (glej vrstici 48 oziroma 50). V konkretnem primeru najprej alociramo blok 37 bytov, nato pa blok pomnilnika, ki je za 133 bytov večji od strukture date.V vrsticah 49 in 51 vidimo, da moramo pri dealokaciji polj uporabiti oglate oklepaje [ ] .
Seveda lahko tudi v C++ še vedno uporabljamo standardne C-jevske funkcije malloc(), calloc(), in free().
.
KAZALCI NA FUNKCIJE
Primer programa ------> FUNCPNT.CPP
Program FUNCPNT.CPP ponazoruje uporabo kazalca na funkcijo. To ni nič novega, saj poznamo to možnost tudi v jeziku ANSI-C.
V vrstici 7 je definiran kazalec na funkcijo, ki ne vraza nič (void) in uporablja en sam formalni parameter tipa float . Tej obliki ustrezajo vse tri funkcije, deklarirane v vrsticah od 4 do 6 in jih lahko zato kličemo s tem kazalcem.
V vrstici 14 kličemo funkcijo print_stuff() s parametrom pi. V vrstici 15 dodelimo funkcijskemu kazalcu function_pointer vrednost print_stuff in uporabimo ta kazalec za ponoven klic funkcije v vrstici 16. Vrstice 17 do 22 nam dajejo dodatne zglede.
Ime funkcije je v bistvu konstantni kazalec na
to funkcijo (in se tako ne more spreminjati). To je tako kot pri imenovanju
polj (arrays), kjer je ime polja konstantni kazalec na prvi element polja.