logo

C Pokazivači

Pokazivač u jeziku C je varijabla koja pohranjuje adresu druge varijable. Ova varijabla može biti tipa int, char, array, function ili bilo koji drugi pokazivač. Veličina pokazivača ovisi o arhitekturi. Međutim, u 32-bitnoj arhitekturi veličina pokazivača je 2 bajta.

Razmotrite sljedeći primjer da definirate pokazivač koji pohranjuje adresu cijelog broja.

 int n = 10; int* p = &n; // Variable p of type pointer is pointing to the address of the variable n of type integer. 

Deklaracija pokazivača

Pokazivač u c jeziku može se deklarirati pomoću * (simbol zvjezdice). Također je poznat kao indirektni pokazivač koji se koristi za dereferenciranje pokazivača.

 int *a;//pointer to int char *c;//pointer to char 

Primjer pokazivača

Primjer korištenja pokazivača za ispis adrese i vrijednosti dan je u nastavku.

primjer pokazivača

Kao što možete vidjeti na gornjoj slici, varijabla pokazivača pohranjuje adresu brojčane varijable, tj. fff4. Vrijednost brojčane varijable je 50. Ali adresa pokazivačke varijable p je aaa3.

Uz pomoć * ( posredni operator ), možemo ispisati vrijednost pokazivačke varijable p.

stol od lateksa

Pogledajmo primjer pokazivača kako je objašnjeno za gornju sliku.

 #include int main(){ int number=50; int *p; p=&number;//stores the address of number variable printf('Address of p variable is %x 
',p); // p contains the address of the number therefore printing p gives the address of number. printf('Value of p variable is %d 
',*p); // As we know that * is used to dereference a pointer therefore if we print *p, we will get the value stored at the address contained by p. return 0; } 

Izlaz

numpy standardna devijacija
 Address of number variable is fff4 Address of p variable is fff4 Value of p variable is 50 

Pokazivač na niz

 int arr[10]; int *p[10]=&arr; // Variable p of type pointer is pointing to the address of an integer array arr. 

Pokazivač na funkciju

 void show (int); void(*p)(int) = &display; // Pointer p is pointing to the address of a function 

Pokazivač na strukturu

 struct st { int i; float f; }ref; struct st *p = &ref; 
c pokazivači

Prednost pokazivača

1) Pokazivač smanjuje kod i poboljšava performanse , koristi se za dohvaćanje nizova, stabala itd. i koristi se s nizovima, strukturama i funkcijama.

2) Možemo vratiti više vrijednosti iz funkcije pomoću pokazivača.

3) To vas čini sposobnim pristupite bilo kojoj memorijskoj lokaciji u memoriji računala.

Upotreba pokazivača

Postoje mnoge primjene pokazivača u c jeziku.

1) Dinamička dodjela memorije

U jeziku c možemo dinamički dodijeliti memoriju pomoću funkcija malloc() i calloc() gdje se koristi pokazivač.

2) Nizovi, funkcije i strukture

Pokazivači u c jeziku naširoko se koriste u nizovima, funkcijama i strukturama. Smanjuje kod i poboljšava izvedbu.

Adresa (&) operatera

Adresa operatora '&' vraća adresu varijable. Ali, trebamo koristiti %u za prikaz adrese varijable.

np std
 #include int main(){ int number=50; printf('value of number is %d, address of number is %u',number,&number); return 0; } 

Izlaz

 value of number is 50, address of number is fff4 

NULL pokazivač

Pokazivač kojem nije dodijeljena nikakva vrijednost osim NULL poznat je kao NULL pointer. Ako nemate nikakvu adresu koju treba navesti u pokazivaču u trenutku deklaracije, možete dodijeliti NULL vrijednost. To će omogućiti bolji pristup.

 int *p=NULL; 

U većini knjižnica, vrijednost pokazivača je 0 (nula).

Pokazivač Program za zamjenu dva broja bez korištenja treće varijable.

 #include int main(){ int a=10,b=20,*p1=&a,*p2=&b; printf('Before swap: *p1=%d *p2=%d',*p1,*p2); *p1=*p1+*p2; *p2=*p1-*p2; *p1=*p1-*p2; printf('
After swap: *p1=%d *p2=%d',*p1,*p2); return 0; } 

Izlaz

 Before swap: *p1=10 *p2=20 After swap: *p1=20 *p2=10 

Čitanje složenih pokazivača

Postoji nekoliko stvari koje se moraju uzeti u obzir dok se čitaju složeni pokazivači u C-u. Pogledajmo prvenstvo i asocijativnost operatora koji se koriste u vezi s pokazivačima.

OperaterPrednostAsocijativnost
(), []1S lijeva nadesno
*, identifikator2S desna na lijevo
Tip podataka3-

Ovdje moramo primijetiti da,

  • (): Ovaj operator je operator u zagradama koji se koristi za deklariranje i definiranje funkcije.
  • []: Ovaj operator je operator indeksa polja
  • * : Ovaj operator je operator pokazivača.
  • Identifikator: To je naziv pokazivača. Prioritet će uvijek biti dodijeljen ovome.
  • Tip podataka: Tip podataka je tip varijable na koju pokazivač treba pokazivati. Također uključuje modifikator kao što je signed int, long, itd.).

Kako čitati pokazivač: int (*p)[10].

Da bismo pročitali pokazivač, moramo vidjeti da () i [] imaju jednaku prednost. Stoga se ovdje mora uzeti u obzir njihova asocijativnost. Asocijativnost je slijeva nadesno, tako da prioritet ide na ().

Unutar zagrada (), operator pokazivača * i naziv pokazivača (identifikator) p imaju isti prioritet. Stoga se ovdje mora uzeti u obzir njihova asocijativnost koja ide zdesna nalijevo, tako da prioritet ide p, a drugi prioritet ide *.

ažuriranje Jave

Dodijelite 3. prioritet [] jer vrsta podataka ima posljednju prednost. Stoga će pokazivač izgledati ovako.

  • char -> 4
  • * -> 2
  • p -> 1
  • [10] -> 3

Pokazivač će se čitati kao da je p pokazivač na niz cijelih brojeva veličine 10.

Primjer

Kako čitati sljedeći pokazivač?

 int (*p)(int (*)[2], int (*)void)) 

Obrazloženje

Ovaj pokazivač će se čitati kao p je pokazivač na takvu funkciju koja prihvaća prvi parametar kao pokazivač na jednodimenzionalni niz cijelih brojeva veličine dva, a drugi parametar kao pokazivač na funkciju čiji je parametar nevažeći, a tip povrata je cijeli broj.