Víme, že proměnná pointer může uložit adresu paměti v jazyce C a v tomto článku se naučíme, jak použít tento ukazatel pro přístup k datům uloženým v místě paměti, na které ukazuje ukazatel.
Co je to ukazatel?
Nejprve si zopakujeme, co je ukazatel. Ukazatel je proměnná, která ukládá paměťovou adresu jiné proměnné. Ukazatel nám pomáhá manipulovat s daty v adrese paměti, na kterou ukazatel ukazuje. Navíc více ukazatelů může ukazovat na stejnou paměť.
smyčky while a do while v Javě
Zvažte následující příklad,
int num = 10; int *ptr; ptr = #>
Uložili jsme adresu na jednom proměnná v ptr ukazatel, ale nyní, jak získat přístup k hodnotě uložené v paměti na adrese, na kterou ukazuje ptr ? Zde přichází na řadu dereferencování.
Dereference Ukazatel v C
Přístup nebo manipulace s obsahem, který je uložen na adrese paměti, na kterou ukazuje ukazatel, pomocí operátoru dereference nebo nepřímého operátoru (*), se nazývá dereferencování ukazatele.
Ukazatel dereferencování v C
Syntaxe pro dereferencování ukazatele
K dereferenci ukazatele používáme operátor nepřímosti (*) jako předponu:
* ( pointer_name )>
Pro úpravu dat uložených v paměti používáme
* ( pointer_name ) = new_value;>
Je třeba poznamenat, že nová_hodnota musí být stejného typu jako předchozí.
Zvažte výše uvedené příklady, kde ptr ukazovat na zda, t K obsahu v adrese paměti může přistupovat operátor dereferencování *. Nyní *ptr načte obsah uložený na adrese, která je 10.
Adresa a hodnoty paměti num a ptr budou vypadat takto.
| Variabilní | Adresa paměti | Hodnota |
|---|---|---|
| číslo = 10 | 202020 | 10 |
| 202021 | ||
| 202022 | ||
| 202023 | ||
| ptr = &č | 202024 – 202032 | 202020 |
Poznámka: Předpokládali jsme, že architektura ve výše uvedeném příkladu je bajtově adresovatelná, tj. minimální jednotkou, která má samostatnou adresu, je bajt.
Příklady dereferencování ukazatele
Příklad 1:
Použití ukazatele pro přístup a úpravu hodnoty celočíselné proměnné.
C
r v c programování
anakonda vs had python
// C Program to illustrate the dereferencing of pointer> #include> int> main()> {> >// Declare integer variable number> >int> num = 10;> >// Declare pointer to store address of number> >int>* ptr = #> >// Print the value of number> >printf>(>'Value of num = %d
'>, num);> >// Print Address of the number using & operator> >printf>(>'Address of num = %d
'>, &num);> >// Print Address stored in the pointer> >printf>(>'Address stored in the ptr = %p
'>, ptr);> >printf>(>'Dereference content in ptr using *ptr
'>);> >// Access the content using * operator> >printf>(>'Value of *ptr = %d
'>, *ptr);> >printf>(>'Now, *ptr is same as number
'>);> >printf>(>'Modify the value using pointer to 6
'>);> >// Modify the content in the address to 6 using pointer> >*ptr = 6;> >// Print the modified value using pointer> >printf>(>'Value of *ptr = %d
'>, *ptr);> >// Print the modified value using variable> >printf>(>'Value of number = %d
'>, num);> >return> 0;> }> |
>
>
typ v jazyce Java
Výstup
Value of num = 10 Address of num = 0x7ffe47d51b4c Address stored in the ptr = 0x7ffe47d51b4c Dereference content in ptr using *ptr Value of *ptr = 10 Now, *ptr is same as number Modify the value using pointer to 6 Value of *ptr = 6 Value of number = 6>
Příklad 2: Dereferencování dvojitého ukazatele
Dvojité ukazatele lze také dereferencovat pomocí stejné logiky, ale budete muset použít operátor nepřímého směru dvakrát: Jeden pro přesun na ukazatel, na který ukazuje dvojitý ukazatel, a druhý pro přístup ke skutečné hodnotě.
C
// C program to dereference double pointer> #include> int> main()> {> >int> var = 10;> >int>* ptr = &var;> >// double pointer> >int>** dptr = &ptr;> >// dereferencing the double pointer> >printf>(>'Accesing value from double pointer using '> >'**dptr: %d'>,> >**dptr);> >return> 0;> }> |
>
java programovací pole
>Výstup
Accesing value from double pointer using **dptr: 10>
Stejně tak můžeme dereferencovat ukazatele jakékoli úrovně.
Jak funguje dereferencování?
Kdykoli požádáme kompilátor, aby dereferencoval ukazatel, provede tři věci:
- Nejprve vyhledá adresu uloženou v ukazateli.
- Poté hledá typ ukazatele, aby mohl odvodit množství paměti ke čtení. Například 4 byes pro int, 1 byte pro char atd. To je také hlavní důvod, proč musíme v deklaraci specifikovat typ ukazatele, i když velikost každého ukazatele v systému je stejná.
- Nakonec přečte paměť a vrátí uložená data.
Poznámka: Z výše uvedené úvahy můžeme také odvodit, že nemůžeme dereferencovat ukazatel prázdnoty, protože velikost dat, na která ukazuje, není známa. Takže musíme přetypovat ukazatel na prázdnotu, abychom ho dereferencovali.