logo

Dereference Ukazatel v C

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.