C pokazivači (s primjerima)

U ovom vodiču naučit ćete o pokazivačima; što su pokazivači, kako ih upotrebljavate i uobičajene pogreške s kojima biste se mogli suočiti u radu s njima uz pomoć primjera.

Pokazivači su snažne značajke programiranja na C i C ++. Prije nego što naučimo pokazivače, naučimo o adresama u C programiranju.

Adresa u C

Ako u svom programu imate varijablu var, &vardat će vam njezinu adresu u memoriji.

Adresu smo koristili mnogo puta dok smo koristili scanf()funkciju.

 scanf("%d", &var);

Ovdje se vrijednost koju je unijeo korisnik pohranjuje na adresu varijable varijable. Uzmimo radni primjer.

 #include int main() ( int var = 5; printf("var: %d", var); // Notice the use of & before var printf("address of var: %p", &var); return 0; ) 

Izlaz

 var: 5 adresa var: 2686778

Napomena: Vjerojatno ćete dobiti drugu adresu kada pokrenete gornji kod.

C Pokazatelji

Pokazivači (varijable pokazivača) su posebne varijable koje se koriste za pohranu adresa, a ne vrijednosti.

Sintaksa pokazivača

Evo kako možemo deklarirati pokazivače.

 int* p;

Ovdje smo proglasili pokazivač p inttipa.

Pokazivače možete prijaviti i na ove načine.

 int *p1; int * p2; 

Uzmimo još jedan primjer deklariranja pokazivača.

 int* p1, p2;

Ovdje smo proglasili pokazivač p1 i normalnu varijablu p2.

Dodjeljivanje adresa Pointerima

Uzmimo primjer.

 int* pc, c; c = 5; pc = &c; 

Ovdje je 5 dodijeljeno c varijabli. I, adresa c dodijeljena je pc pokazivaču.

Dobijte vrijednost stvari na koju upućuju pokazivači

Da bismo dobili vrijednost stvari na koju ukazuju pokazivači, koristimo *operator. Na primjer:

 int* pc, c; c = 5; pc = &c; printf("%d", *pc); // Output: 5

Ovdje je adresa cračunala dodijeljena pokazivaču računala. Da bismo dobili vrijednost pohranjenu na toj adresi, koristili smo * pc.

Napomena: U gornjem primjeru, pc je pokazivač, a ne *pc. Ne možete i ne biste trebali učiniti nešto poput *pc = &c;

Usput, *naziva se operator preusmjeravanja (kada se radi s pokazivačima). Djeluje na pokazivač i daje vrijednost pohranjenu u tom pokazivaču.

Promjena vrijednosti na koju su ukazali pokazivači

Uzmimo primjer.

 int* pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // Output: 1 printf("%d", *pc); // Ouptut: 1

Pokazatelju računala dodijelili smo adresu c.

Zatim smo vrijednost c promijenili u 1. Budući da su pc i adresa c jednaki, *pcdobivamo 1.

Uzmimo još jedan primjer.

 int* pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // Ouptut: 1 printf("%d", c); // Output: 1 

Pokazatelju računala dodijelili smo adresu c.

Zatim smo promijenili *pcna 1 pomoću *pc = 1;. Budući da su pc i adresa c jednaki, c će biti jednako 1.

Uzmimo još jedan primjer.

 int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // Output: 5 pc = &d; printf("%d", *pc); // Ouptut: -15

U početku se adresa c dodjeljuje računarskom pokazivaču pomoću pc = &c;. Budući da je c 5, *pcdaje nam 5.

Zatim se pomoću računara pokazivaču računala dodijeli adresa d pc = &d;. Budući da je d -15, *pcdaje nam -15.

Primjer: Rad pokazivača

Uzmimo radni primjer.

 #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; ) 

Izlaz

 Adresa c: 2686784 Vrijednost c: 22 Adresa pokazivača pc: 2686784 Sadržaj pokazivača pc: 22 Adresa pokazivača pc: 2686784 Sadržaj pokazivača pc: 11 Adresa c: 2686784 Vrijednost c: 2 

Objašnjenje 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;

U oba slučaja stvaramo pokazivač p(ne *p) i dodjeljujemo &cmu.

Da bismo izbjegli ovu zabunu, možemo se koristiti sljedećom izjavom:

 int* p = &c;

Sada znate što su pokazivači, u sljedećem ćete vodiču naučiti kako su pokazivači povezani s nizovima.

Zanimljivi članci...