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)
& |
Naslovni operator, da naslov spremenljivke |
* |
Operator indirekcije, da vsebino lokacije, katere naslov je v kazalcu. |
pc = &a; b = *pc; /* isto bi naredili z b = a */
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"; |
![]() |
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 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 !
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 ).
void zamenjaj(double *p1, double *p2) { double temp; temp = *p1; /* kazalca p1 in p2 sta kopiji kazalcev klicoce funkcije */ *p1= *p2; /* zato kazeta na iste spremenljivke kot pa in pb */ *p2 = temp; } main { double a,b, *pa, *pb; . . . . . . pa = &a; pb = &b; /* kazalca naslavljata spremenljivki a in b */ zamenjaj (pa, pb); /* spr. a in b bosta imeli zamenjani vrednosti */ }
/* Primer izracuna maksimuma tabelirane funkcije */ #define N 20 /* Namesto stevilcnih konstant raje uporabljajmo simbole */ main() { double x[N], y[N], yMax; int i; double max (double array[ ], int) ; /* vnaprejsnja deklaracija */ for(i=0;i < N ; i++) { printf("Vnesi x in y:"); scanf("%lf %lf", &x[i], &y[i]); } yMax = max(y,N); printf("Vrednost maksimuma:%lf \n",yMax); } double max(double value[], int numValues) { int i; double maxValue; maxValue = value[0]; for(i=0; i < numValues; i++) if(value[i] > maxValue) maxValue = value[i]; return (maxValue ) ; }
double max(double *array, int)ali kar
double max (double*, int)
double A[4][5] ;
Prvi vrstici lahko rečemo A[0]. Velja:
A = A[0] = &A[0][0]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]
double A[4][5]; void clearMat(double m[][5]) { int row, col; for(row = 0; row <4; ++row){ for(col = 0; col<5; ++col) m[row][col] = 0.0; } } main() { clearMat(A); }
Alternativna možnost deklaracije s kazalcem:
char *lines[3] = {"prva vrstica", "druga vrstica", "tretja vrstica"};
In sedaj še primer uporabe kazalcev na kazalce:
Kako bi take podatke deklarirali? kako lahko uporabimo kazalec za izpis vrstic?
char **currLine, *lines[3] = {"prva vrstica", "druga vrstica", "tretja vrstica"}; currLine = lines; for (i=0;i<3;i++) printf("%s \n", *currLine++);
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!!)
float x= 100.0, y=200.0, c; float (* operacija)(float,float); /*... Prevajalniku povemo, da kazalec "operacija" kaze na funkcijo, ki ima dva argumenta in vrne dani tip */ main() { c = vsota(x, y); printf("%f \n", c); /* lahko pa tudi tako... */ operacija = vsota; /* kazalcu priredimo naslov funkcije "vsota" */ c = operacija(50.0, 150.0); printf("%f \n", c); } float vsota (float a, float b) { return (a+b); }