Kazalci


Primer deklaracije kazalca

char a,b , *pc ;
a in b sta spremenljivki tipa char, pc pa je kazalec na spremenljivko enakega tipa (pri tem se ni jasno na katero spremenljivko kaže).

Kazalec je tudi spremenljivka danega tipa(v našem primeru kazalec tipa char)


Kazalčni operatorji

&
Naslovni operator, da naslov spremenljivke 
* 
Operator indirekcije, da vsebino lokacije, katere naslov je v kazalcu.

Primer uporabe:

          pc = &a;
          b = *pc;      /* isto bi naredili z b = a  */


 

Pogoste napake pri uporabi kazalcev

 
 float a, b, *p ;
char c, *pc, niz[100] ;
. . . . . . .
*p = 12.5;      /*p še ni definiran?*/
p = & 12.5;
*a = 12.5;
a = *b;
niz = "Pozdrav";

To pa je pravilno!

int *x, y[10];
char c, *pc;
. . . . . .
x = y; /* je isto kot x = &y[0] */ 

pc = “Pozdrav”; 
/* ..OK, ker je pc spremenljivka */

Aritmetika s kazalci


Aritmetika s kazalci se razlikuje od aritmetike s spremenljivkami.


 

p          je enako kot   &polje[0]
(p+4)      je enako kot   &polje[4]
p++...     kazalec p bo kazal  na naslednji element

polje      je enako kot   &polje[0]
*polje     je enako kot   polje [0] 
*(polje+1) je enako kot   polje[1] 
&polje[5] - &polje[2]  je enako  3 

polje[i]   je enako kot   *(polje +i) 
           je enako kot   *(i+polje)
           je enako kot   i[polje]
Ne glede na velikost posameznih elementov polja !


Kazalci kot argumenti funkcije


To je ekvivalent "klica po referenci", čeprav C striktno uporablja "klic po vrednosti". V tem primeru se mora zato uporabljati za argumente kazalce (prenaša se njihove vrednosti ).

Primer:


Polja kot argumenti funkcije

 

Opomba:

Primer ponazoruje tudi vnaprejsnjo deklaracijo funkcije . Tako deklaracijo bi lahko izvedli tudi s stavki naslednje oblike: ali kar

Kazalci na večdimenzijska polja

Primer:

Pri enodimenzijskih poljih je ime polja naslov (kazalec na) prvi element polja.

Tudi pri večdimenzijskih poljih je ime A naslov prvega elementa polja, A[0][0].

Prvi vrstici lahko rečemo A[0]. Velja:

A in A[i] so konstantni kazalci (naslovi),ki jih ne moremo spreminjati.

A naslavlja prvo vrstico matrike. A+1 naslavlja naslednjo vrstico matrike, A[1]


Večdimenzijska polja kot argumenti funkcije

 

Primer:

Pri večdimenzijskih poljih mora biti velikost dimenzij (razen skrajno leve) deklarirana tudi v klicani funkciji !!


Alternativna možnost deklaracije s kazalcem:
 


 


Kazalci na kazalce

Najprej si poglejmo, kako rezerviramo kar celo polje kazalcev:

Primer:


In sedaj še primer uporabe kazalcev na kazalce:

Primer:


 

Kako bi take podatke deklarirali? kako lahko uporabimo kazalec za izpis vrstic?

Opomba:


Kazalci na funkcije


Definiramo lahko tudi kazalce na funkcije. Tak kazalec lahko kaže sedaj na eno, sedaj na drugo funkcijo (istega tipa).

Kazalec na funkcijo je namreč spremenljivka!! Zato je lahko tudi element nekega polja ali strukture ! (uporabno!!)

Primer:

Prevajalniku povemo,da kazalec kaže na funkcijo, ki ima dva argumenta in vrne dani tip.