V tej vadnici boste izvedeli več o kazalcih; kaj so kazalci, kako jih uporabljate in pogoste napake, s katerimi se lahko srečate pri delu z njimi s pomočjo primerov.
Kazalci so zmogljive funkcije programiranja na C in C ++. Preden se naučimo kazalcev, se naučimo o naslovih v programiranju C.
Naslov v C
Če imate v programu spremenljivko var, &var
vam bo v pomnilniku dal njen naslov.
Med uporabo scanf()
funkcije smo že večkrat uporabili naslov .
scanf("%d", &var);
Tu je vrednost, ki jo vnese uporabnik, shranjena na naslovu spremenljivke var. Vzemimo delovni primer.
#include int main() ( int var = 5; printf("var: %d", var); // Notice the use of & before var printf("address of var: %p", &var); return 0; )
Izhod
var: 5 naslov var: 2686778
Opomba: Ko zaženete zgornjo kodo, boste verjetno dobili drug naslov.
C Kazalci
Kazalci (kazalec spremenljivke) so posebne spremenljivke, ki se uporabljajo za shranjevanje naslovov in ne vrednosti.
Sintaksa kazalca
Evo, kako lahko razglasimo kazalce.
int* p;
Tu smo razglasili kazalec p int
tipa.
Kazalce lahko prijavite tudi na te načine.
int *p1; int * p2;
Vzemimo še en primer razglasitve kazalcev.
int* p1, p2;
Tu smo razglasili kazalec p1 in normalno spremenljivko p2.
Dodeljevanje naslovov kazalcem
Vzemimo primer.
int* pc, c; c = 5; pc = &c;
Tu je spremenljivki c dodeljeno 5. In naslov c je dodeljen kazalcu pc.
Pridobite vrednost stvari, ki jo kažejo kazalci
Za pridobitev vrednosti stvari, na katero kažejo kazalci, uporabimo *
operator. Na primer:
int* pc, c; c = 5; pc = &c; printf("%d", *pc); // Output: 5
Tu c
je pc kazalcu dodeljen naslov . Za pridobitev vrednosti, shranjene na tem naslovu, smo uporabili * pc.
Opomba: V zgornjem primeru je pc kazalec, ne *pc
. Česa takega ne morete in ne smete storiti *pc = &c
;
Mimogrede, *
se imenuje dereference operator (pri delu s kazalci). Deluje s kazalcem in daje vrednost, shranjeno v tem kazalcu.
Spreminjanje vrednosti, na katero opozarjajo kazalci
Vzemimo primer.
int* pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // Output: 1 printf("%d", *pc); // Ouptut: 1
Kazalcu pc smo dodelili naslov c.
Nato smo vrednost c spremenili na 1. Ker sta pc in naslov c enaka, *pc
dobimo 1.
Vzemimo še en primer.
int* pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // Ouptut: 1 printf("%d", c); // Output: 1
Kazalcu pc smo dodelili naslov c.
Nato smo *pc
z uporabo spremenili na 1 *pc = 1;
. Ker sta pc in naslov c enaka, bo c enak 1.
Vzemimo še en primer.
int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // Output: 5 pc = &d; printf("%d", *pc); // Ouptut: -15
Sprva je naslov c dodeljen kazalcu pc z uporabo pc = &c;
. Ker je c 5, *pc
nam daje 5.
Nato se naslovu d dodeli kazalcu pc z uporabo pc = &d;
. Ker je d -15, *pc
nam daje -15.
Primer: Delo kazalcev
Vzemimo delovni primer.
#include int main() ( int* pc, c; c = 22; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 22 pc = &c; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 22 c = 11; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 11 *pc = 2; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 2 return 0; )
Izhod
Naslov c: 2686784 Vrednost c: 22 Naslov kazalca pc: 2686784 Vsebina kazalca pc: 22 Naslov kazalca pc: 2686784 Vsebina kazalca pc: 11 Naslov c: 2686784 Vrednost c: 2
Pojasnilo programa
int* pc, c;
Here, a pointer pc and a normal variable c, both of typeint
, is created.
Since pc and c are not initialized at initially, pointer pc points to either no address or a random address. And, variable c has an address but contains random garbage value.c = 22;
This assigns 22 to the variable c. That is, 22 is stored in the memory location of variable c.pc = &c;
This assigns the address of variable c to the pointer pc.c = 11;
This assigns 11 to variable c.*pc = 2;
This change the value at the memory location pointed by the pointer pc to 2.
Common mistakes when working with pointers
Suppose, you want pointer pc to point to the address of c. Then,
int c, *pc; // pc is address but c is not pc = c; // Error // &c is address but *pc is not *pc = &c; // Error // both &c and pc are addresses pc = &c; // both c and *pc values *pc = c;
Here's an example of pointer syntax beginners often find confusing.
#include int main() ( int c = 5; int *p = &c; printf("%d", *p); // 5 return 0; )
Why didn't we get an error when using int *p = &c;
?
It's because
int *p = &c;
is equivalent to
int *p: p = &c;
V obeh primerih ustvarjamo kazalec p
(ne *p
) in mu dodeljujemo &c
.
Da bi se izognili tej zmedi, lahko uporabimo izjavo, kot je ta:
int* p = &c;
Zdaj veste, kaj so kazalci, v naslednji vadnici boste izvedeli, kako so kazalci povezani z nizi.