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.
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;
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.
Operater | Prednost | Asocijativnost |
---|---|---|
(), [] | 1 | S lijeva nadesno |
*, identifikator | 2 | S desna na lijevo |
Tip podataka | 3 | - |
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.