Kazalci C (z primeri)

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, &varvam 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 inttipa.

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 cje 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, *pcdobimo 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 *pcz 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, *pcnam daje 5.

Nato se naslovu d dodeli kazalcu pc z uporabo pc = &d;. Ker je d -15, *pcnam 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

  1. int* pc, c;

    Here, a pointer pc and a normal variable c, both of type int, 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.
  2. c = 22;

    This assigns 22 to the variable c. That is, 22 is stored in the memory location of variable c.
  3. pc = &c;

    This assigns the address of variable c to the pointer pc.
  4. c = 11;

    This assigns 11 to variable c.
  5. *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.

Zanimive Članki...