Ukazatel v jazyce C je proměnná, která uchovává adresu jiné proměnné. Tato proměnná může být typu int, char, pole, funkce nebo jakýkoli jiný ukazatel. Velikost ukazatele závisí na architektuře. V 32bitové architektuře je však velikost ukazatele 2 bajty.
Zvažte následující příklad pro definování ukazatele, který ukládá 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ášení ukazatele
Ukazatel v jazyce c lze deklarovat pomocí * (symbol hvězdičky). Je také známý jako nepřímý ukazatel používaný k dereferenci ukazatele.
int *a;//pointer to int char *c;//pointer to char
Příklad ukazatele
Níže je uveden příklad použití ukazatelů pro tisk adresy a hodnoty.
Jak můžete vidět na obrázku výše, proměnná ukazatel ukládá adresu proměnné čísla, tj. fff4. Hodnota číselné proměnné je 50. Ale adresa ukazatelové proměnné p je aaa3.
Pomocí * ( nepřímý operátor ), můžeme vytisknout hodnotu ukazatelové proměnné p.
řetězec v poli v c
Podívejme se na příklad ukazatele vysvětlený pro výše uvedený obrázek.
#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ýstup
java výjimky
Address of number variable is fff4 Address of p variable is fff4 Value of p variable is 50
Ukazatel na pole
int arr[10]; int *p[10]=&arr; // Variable p of type pointer is pointing to the address of an integer array arr.
Ukazatel na funkci
void show (int); void(*p)(int) = &display; // Pointer p is pointing to the address of a function
Ukazatel na strukturu
struct st { int i; float f; }ref; struct st *p = &ref;
Výhoda ukazatele
1) Ukazatel snižuje kód a zlepšuje výkon , používá se k načítání řetězců, stromů atd. a používá se s poli, strukturami a funkcemi.
2) Můžeme vrátit více hodnot z funkce pomocí ukazatele.
3) To vám umožní přístup k libovolnému paměťovému místu v paměti počítače.
Použití ukazatele
V jazyce C existuje mnoho aplikací ukazatelů.
1) Dynamická alokace paměti
V jazyce c můžeme dynamicky alokovat paměť pomocí funkcí malloc() a calloc(), kde se používá ukazatel.
2) Pole, funkce a struktury
Ukazatele v jazyce c jsou široce používány v polích, funkcích a strukturách. Snižuje kód a zlepšuje výkon.
Adresa (&) operátora
Adresa operátoru '&' vrací adresu proměnné. K zobrazení adresy proměnné však musíme použít %u.
jak předělat ve photoshopu
#include int main(){ int number=50; printf('value of number is %d, address of number is %u',number,&number); return 0; }
Výstup
value of number is 50, address of number is fff4
Ukazatel NULL
Ukazatel, kterému není přiřazena žádná hodnota, ale je NULL, se nazývá ukazatel NULL. Pokud nemáte žádnou adresu, která by měla být uvedena v ukazateli v době deklarace, můžete přiřadit hodnotu NULL. Poskytne lepší přístup.
int *p=NULL;
Ve většině knihoven je hodnota ukazatele 0 (nula).
Ukazatel Program pro výměnu dvou čísel bez použití 3. proměnné.
#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ýstup
Before swap: *p1=10 *p2=20 After swap: *p1=20 *p2=10
Čtení složitých ukazatelů
Existuje několik věcí, které je třeba vzít v úvahu při čtení komplexních ukazatelů v C. Podívejme se na prioritu a asociativitu operátorů, které se používají ohledně ukazatelů.
Operátor | Přednost | Asociativnost |
---|---|---|
(), [] | 1 | Zleva do prava |
*, identifikátor | 2 | Zprava doleva |
Datový typ | 3 | - |
Zde si musíme všimnout,
- (): Tento operátor je operátor hranatých závorek používaný k deklaraci a definování funkce.
- []: Tento operátor je operátor dolního indexu pole
- * : Tento operátor je ukazatelový operátor.
- Identifikátor: Je to název ukazatele. Tomu bude vždy přiřazena priorita.
- Datový typ: Datový typ je typ proměnné, na kterou má ukazatel ukazovat. Zahrnuje také modifikátor jako signovaný int, dlouhý atd.).
Jak číst ukazatel: int (*p)[10].
Abychom přečetli ukazatel, musíme vidět, že () a [] mají stejnou prioritu. Proto je zde třeba zvážit jejich asociativitu. Asociativita je zleva doprava, takže priorita má ().
Uvnitř závorky (), operátor ukazatele * a název ukazatele (identifikátor) p mají stejnou prioritu. Proto je zde třeba uvažovat jejich asociativitu, která je zprava doleva, takže priorita má p a druhá priorita *.
mylivecricket.in
Přiřaďte 3. prioritu [], protože datový typ má poslední prioritu. Ukazatel tedy bude vypadat následovně.
- znak -> 4
- * -> 2
- p -> 1
- [10] -> 3
Ukazatel bude čten jako p je ukazatel na pole celých čísel o velikosti 10.
Příklad
Jak číst následující ukazatel?
int (*p)(int (*)[2], int (*)void))
Vysvětlení
Tento ukazatel se bude číst jako p je ukazatel na takovou funkci, která přijímá první parametr jako ukazatel na jednorozměrné pole celých čísel velikosti dva a druhý parametr jako ukazatel na funkci, jejíž parametr je neplatný a návratový typ je celé číslo.