logo

Dereference pointer v C

Vieme, že premenná ukazovateľ môže uložiť adresu pamäte v jazyku C a v tomto článku sa naučíme, ako použiť tento ukazovateľ na prístup k údajom uloženým v mieste pamäte, na ktoré ukazuje ukazovateľ.

Čo je ukazovateľ?

Najprv si zopakujeme, čo je ukazovateľ. Ukazovateľ je premenná, ktorá ukladá pamäťovú adresu inej premennej. Ukazovateľ nám pomáha manipulovať s údajmi v adrese pamäte, na ktorú ukazovateľ ukazuje. Viaceré ukazovatele navyše môžu ukazovať na rovnakú pamäť.



Zvážte nasledujúci príklad,

int num = 10; int *ptr; ptr = #>

Uložili sme adresu na jeden premenná v ptr ukazovateľ, ale teraz, ako získať prístup k hodnote uloženej v pamäti na adrese, na ktorú ukazuje ptr ? Tu prichádza do hry dereferencovanie.

java nemenný zoznam

Dereference pointer v C

Prístup alebo manipulácia s obsahom, ktorý je uložený na adrese pamäte, na ktorú ukazuje ukazovateľ, pomocou operátora dereferencovania alebo nepriameho smerovania (*), sa nazýva dereferencovanie ukazovateľa.



Ukazovateľ dereferencovania v C

Syntax pre dereferencovanie ukazovateľa

Na dereferencovanie ukazovateľa používame operátor nepriameho smeru (*) ako predponu:

 * ( pointer_name )>

Na úpravu údajov uložených v pamäti používame



 * ( pointer_name ) = new_value;>

Je potrebné poznamenať, že nová_hodnota musí byť rovnakého typu ako predchádzajúca.

Zvážte vyššie uvedené príklady, kde ptr ukazuje na či, t K obsahu v adrese pamäte môže pristupovať operátor dereferencovania *. Teraz *ptr načíta obsah uložený na adrese, ktorá je 10.

Adresa a hodnoty pamäte num a ptr budú vyzerať takto.

ako odstrániť prvý znak v programe excel
Variabilné Adresa pamäte Hodnota
číslo = 10 202020 10
202021
202022
202023
ptr = &č 202024 – 202032 202020

Poznámka: Predpokladali sme, že architektúra vo vyššie uvedenom príklade je adresovateľná bajtom, t.j. minimálna jednotka, ktorá má samostatnú adresu, je bajt.

Príklady dereferencovania ukazovateľa

Príklad 1:

Použitie ukazovateľa na prístup a úpravu hodnoty celočíselnej premennej.

C




// 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;> }>

analýza reťazca na int
>

>

Výkon

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>

Príklad 2: Dereferencovanie dvojitého ukazovateľa

Dvojité ukazovatele možno tiež dereferencovať pomocou rovnakej logiky, ale operátor nepriameho smeru budete musieť použiť dvakrát: Jeden na presun na ukazovateľ, na ktorý ukazuje dvojitý ukazovateľ, a druhý na prístup k skutočnej hodnote.

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;> }>

typ v jazyku Java

>

>

Výkon

Accesing value from double pointer using **dptr: 10>

Len tak môžeme dereferencovať ukazovatele akejkoľvek úrovne.

Ako funguje dereferencovanie?

Kedykoľvek požiadame kompilátor, aby dereferencoval ukazovateľ, vykoná tri veci:

  • Najprv vyhľadá adresu uloženú v ukazovateli.
  • Potom hľadá typ ukazovateľa, aby mohol odvodiť množstvo pamäte na čítanie. Napríklad 4 byes pre int, 1 byte pre char atď. Je to tiež hlavný dôvod, prečo musíme v deklarácii špecifikovať typ ukazovateľa, aj keď veľkosť každého ukazovateľa v systéme je rovnaká.
  • Nakoniec načíta pamäť a vráti uložené dáta.

Poznámka: Z vyššie uvedeného uvažovania môžeme tiež odvodiť, že nemôžeme dereferencovať ukazovateľ prázdnoty, pretože veľkosť údajov, na ktoré ukazuje, nie je známa. Takže musíme pretypovať ukazovateľ prázdnoty, aby sme ho dereferencovali.