Programski jezik C

Kazalci

V programskem jeziku C moramo prej ali slej spoznati kazalce, ki so tako pomembni, da jim posvetimo kar celo poglavje, čeprav je (podzavestno) možno shajati tudi brez njih. Kazalec (pointer) je spremenljivka, ki kaže na drugo spremenljivko.

Morda se poznavalcem drugih programskih jezikov zdijo kazalci odveč, vendar obstajajo problemi, ki jih lažje rešimo s kazalci, oziroma je v drugih programskih jezikih potrebno več nekaj telovadbe, da dosežemo enako.

Tipi kazalcev

Ker kazalci kažejo na druge spremenljivke, je njihov tip odvisen od tipa spremenljivke, na katero kažejo. Torej, če kazalec p kaže na spremenljivko tipa int, bo imel kazalec p tip int *. Ker se obstoječim tipom doda zgolj zvezdico, je tipov kazalcev toliko, kolikor smo spoznali tipov.

Zvezdico * lahko pišemo stično ali nestično.

Oglejmo si naslednjo telovadbo s kazalci.

int i = 5;
int *p;
p = &i; /* Nastavimo kazalec p, da kaže na spremenljivko i. */
*p = 6;

Prva vrstica nam je znana, v njej smo naznanili spremenljivko i z začetno vrednostjo 5. Sedaj pa bodimo pozorni na vse besede v naslednjem odstavku, čeprav verjamem, da marsikomu tudi po parih branjih ne bo jasno, kaj se dogaja.

V drugi vrstici smo naznanili spremenljivko p, kot kazalec na spremenljivko tipa int. V tretji vrstici, desno od enačaja, smo ustvarili kazalec, ki kaže na i, ta je &i, katerega vrednost (z enačajem) priredimo kazalcu p. Sedaj p kaže na i. V zadnji vrstici spremenimo vrednost spremenljivke, na katero kaže p. Ker p kaže na i, smo spremenili vrednost spremenljivke i. Ta sedaj hrani število 6.

Če v zadnji vrstici zvezdice ne bi pisali, bi povzročili, da bi kazalec p kazal na neko spremenljivko, ki se nahaja na naslovu 6, i pa bi še vedno imel vrednost 5.

Ničelni kazalec

Poseben kazalec je ničelni kazalec NULL, ki ne kaže nikamor. Na njemu ni možno uporabiti naslednjih dveh operatorjev.

Operatorja & in *

V zadnjem odstavku smo spoznali še eno vlogo zvezdice * in operator naslov od z znakom &. Vlogi & in * sta si nasprotni. Če & ustvari kazalec na spremenljivko, ga * uniči in vrne spremenljivko. Če si sedaj mislimo, da veljata povezavi p = &i in *p = i, je veliko lažje razumeti, čemu zgoraj i na koncu hrani število 6.

Če je a spremenljivka, ki predstavlja seznam, potem je &a = a. Kazalca na seznam torej ni možno narediti. Enako velja za funkcije, f in &f sta ista.

Kazalci kazalcev

Ker lahko kazalec kaže na kazalec, ki kaže na …, dobiva takšen kazalec nase vedno več odličij – zvezdic.

Nizi znakov

Kazalci največkrat kažejo na spremenljivke tipa char, kamor sodijo tudi nizi znakov.

Če poznamo začetno vrednost niza, katerega ne bomo spreminjali, potem uporabimo tip const char *. Če niz nameravamo spreminjati, potem je char[] pravi tip, saj se pri tipu char * lahko pojavijo težave.

Mešani tipi

Tako kot lahko ustvarjamo sezname seznamov za shranjevanje matrik, lahko ustvarjamo tudi sezname nizov oziroma bolje rečeno sezname kazalcev. Sledeči primer bo naznanil seznam kazalcev na nespremenljive nize znakov.

const char *imena_psov[] = { "Pika", "Runo", "Astor" };

Do imen psov dostopamo preko odmikov imena_psov[2], ki je sedaj tipa const char *.

Če je a spremenljivka, ki predstavlja seznam, potem je a tudi kazalec, za katerega velja a = &a[0]. Zato lahko do vrednosti prvega elementa seznama dostopamo tudi kot *a.