Kazalci


 

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.
 



Kazalo   Funkcije