Ukazovateľ v jazyku C je premenná, ktorá ukladá adresu inej premennej. Táto premenná môže byť typu int, char, pole, funkcia alebo akýkoľvek iný ukazovateľ. Veľkosť ukazovateľa závisí od architektúry. V 32-bitovej architektúre je však veľkosť ukazovateľa 2 bajty.
Zvážte nasledujúci príklad na definovanie ukazovateľa, ktorý ukladá adresu celého čísla.
int n = 10; int* p = &n; // Variable p of type pointer is pointing to the address of the variable n of type integer.
Vyhlásenie ukazovateľa
Ukazovateľ v jazyku c môže byť deklarovaný pomocou * (symbol hviezdičky). Je tiež známy ako nepriamy ukazovateľ, ktorý sa používa na dereferencovanie ukazovateľa.
int *a;//pointer to int char *c;//pointer to char
Príklad ukazovateľa
Príklad použitia ukazovateľov na tlač adresy a hodnoty je uvedený nižšie.
Ako môžete vidieť na obrázku vyššie, premenná ukazovateľa ukladá adresu premennej čísla, t.j. fff4. Hodnota číselnej premennej je 50. Ale adresa ukazovateľovej premennej p je aaa3.
Pomocou * ( nepriamy operátor ), môžeme vytlačiť hodnotu premennej ukazovateľa p.
java double to string
Pozrime sa na príklad ukazovateľa, ako je vysvetlený na obrázku vyššie.
#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; }
Výkon
koľko miliónov je v miliarde
Address of number variable is fff4 Address of p variable is fff4 Value of p variable is 50
Ukazovateľ na pole
int arr[10]; int *p[10]=&arr; // Variable p of type pointer is pointing to the address of an integer array arr.
Ukazovateľ na funkciu
void show (int); void(*p)(int) = &display; // Pointer p is pointing to the address of a function
Ukazovateľ na štruktúru
struct st { int i; float f; }ref; struct st *p = &ref;
Výhoda ukazovateľa
1) Ukazovateľ znižuje kód a zlepšuje výkon , používa sa na získavanie reťazcov, stromov atď. a používa sa s poľami, štruktúrami a funkciami.
2) Môžeme vrátiť viacero hodnôt z funkcie pomocou ukazovateľa.
3) Umožňuje vám to prístup k ľubovoľnému miestu pamäte v pamäti počítača.
Použitie ukazovateľa
V jazyku c existuje veľa aplikácií ukazovateľov.
1) Dynamická alokácia pamäte
V jazyku c môžeme dynamicky alokovať pamäť pomocou funkcií malloc() a calloc(), kde sa používa ukazovateľ.
2) Polia, funkcie a štruktúry
Ukazovatele v jazyku c sú široko používané v poliach, funkciách a štruktúrach. Znižuje kód a zlepšuje výkon.
Adresa (&) operátora
Adresa operátora '&' vracia adresu premennej. Na zobrazenie adresy premennej však musíme použiť %u.
sqrt java matematika
#include int main(){ int number=50; printf('value of number is %d, address of number is %u',number,&number); return 0; }
Výkon
value of number is 50, address of number is fff4
Ukazovateľ NULL
Ukazovateľ, ktorý nemá priradenú žiadnu hodnotu, ale má hodnotu NULL, je známy ako ukazovateľ NULL. Ak v čase deklarácie nemáte v ukazovateli uvedenú žiadnu adresu, môžete priradiť hodnotu NULL. Poskytne lepší prístup.
int *p=NULL;
Vo väčšine knižníc je hodnota ukazovateľa 0 (nula).
Ukazovateľ Program na výmenu dvoch čísel bez použitia 3. premennej.
#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; }
Výkon
Before swap: *p1=10 *p2=20 After swap: *p1=20 *p2=10
Čítanie zložitých ukazovateľov
Existuje niekoľko vecí, ktoré je potrebné vziať do úvahy pri čítaní komplexných ukazovateľov v C. Pozrime sa na prioritu a asociatívnosť operátorov, ktoré sa používajú pri ukazovateľoch.
Operátor | Prednosť | Asociativita |
---|---|---|
(), [] | 1 | Zľava doprava |
*, identifikátor | 2 | Zprava doľava |
Dátový typ | 3 | - |
Tu si musíme všimnúť,
- (): Tento operátor je operátor v zátvorke, ktorý sa používa na deklarovanie a definovanie funkcie.
- []: Tento operátor je operátor dolného indexu poľa
- * : Tento operátor je ukazovateľ.
- Identifikátor: Je to názov ukazovateľa. Tomuto bude vždy priradená priorita.
- Typ údajov: Typ údajov je typ premennej, na ktorú má ukazovateľ ukazovať. Zahŕňa aj modifikátor, ako je podpísaná int, dlhá atď.).
Ako čítať ukazovateľ: int (*p)[10].
Aby sme mohli čítať ukazovateľ, musíme vidieť, že () a [] majú rovnakú prednosť. Preto tu treba zvážiť ich asociatívnosť. Asociativita je zľava doprava, takže priorita má ().
Vo vnútri zátvorky (), operátor ukazovateľa * a názov ukazovateľa (identifikátor) p majú rovnakú prednosť. Preto je potrebné zvážiť ich asociatívnosť, ktorá je sprava doľava, takže priorita má p a druhá priorita *.
počítač vynájdený rok
Priraďte 3. prioritu [], pretože typ údajov má poslednú prioritu. Preto bude ukazovateľ vyzerať nasledovne.
- znak -> 4
- * -> 2
- p -> 1
- [10] -> 3
Ukazovateľ sa bude čítať ako p je ukazovateľ na pole celých čísel veľkosti 10.
Príklad
Ako čítať nasledujúci ukazovateľ?
int (*p)(int (*)[2], int (*)void))
Vysvetlenie
Tento ukazovateľ sa bude čítať ako p je ukazovateľ na takú funkciu, ktorá akceptuje prvý parameter ako ukazovateľ na jednorozmerné pole celých čísel veľkosti dva a druhý parameter ako ukazovateľ na funkciu, ktorej parameter je neplatný a návratový typ je celé číslo.