logo

Kazalec dereference v C

Vemo, da lahko spremenljivka kazalca shrani pomnilniški naslov v jeziku C in v tem članku se bomo naučili, kako uporabiti ta kazalec za dostop do podatkov, shranjenih na pomnilniški lokaciji, na katero kaže kazalec.

Kaj je kazalec?

Najprej pregledamo, kaj je kazalec. Kazalec je spremenljivka, ki shrani pomnilniški naslov druge spremenljivke. Kazalec nam pomaga manipulirati s podatki v pomnilniškem naslovu, na katerega kaže kazalec. Poleg tega lahko več kazalcev kaže na isti pomnilnik.



Razmislite o naslednjem primeru,

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

Shranili smo naslov na enem spremenljivka v ptr kazalec, zdaj pa, kako dostopati do vrednosti, shranjene v pomnilniku na naslovu, na katerega kaže ptr ? Tukaj pride v poštev dereferenciranje.

Kazalec dereference v C

Dostop do vsebine, ki je shranjena v pomnilniškem naslovu, na katerega kaže kazalec, ali ravnanje z njo z uporabo dereferenciranja ali posrednega operaterja (*) se imenuje dereferenciranje kazalca.



pretvorba niza v celo število

Dereferenciranje kazalca v C

Sintaksa za dereferenciranje kazalca

Uporabimo posredni operator (*) kot predpono za dereferenciranje kazalca:

 * ( pointer_name )>

Za spreminjanje podatkov, shranjenih v pomnilniku, uporabljamo



 * ( pointer_name ) = new_value;>

Upoštevati je treba, da mora biti nova_vrednost enakega tipa kot prejšnja.

Razmislite o zgornjih primerih, kjer ptr kaže na ali, t do vsebine v pomnilniškem naslovu lahko dostopa operater dereferenciranja *. Zdaj bo *ptr pridobil vsebino, shranjeno na naslovu, ki je 10.

Naslov in vrednosti pomnilnika num in ptr bodo videti takole.

Spremenljivka Naslov pomnilnika Vrednost
št = 10 202020 10
202021
202022
202023
ptr = &št 202024 – 202032 202020

Opomba: Predpostavili smo, da je arhitektura v zgornjem primeru bajtno naslovljiva, tj. najmanjša enota, ki ima ločen naslov, je bajt.

Primeri dereferenciranja kazalca

Primer 1:

Uporaba kazalca za dostop in spreminjanje vrednosti celoštevilske spremenljivke.

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

jpa proti hibernaciji
>

>

Izhod

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>

2. primer: dereferenciranje dvojnega kazalca

Dvojne kazalce je mogoče tudi dereferencirati z uporabo iste logike, vendar boste morali posredni operator uporabiti dvakrat: enega za premikanje na kazalec, na katerega kaže dvojni kazalec, in drugega za dostop do dejanske vrednosti.

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

>

>

Izhod

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

Tako lahko dereferenciramo kazalce katere koli ravni.

Kako deluje dereferenciranje?

Kadarkoli od prevajalnika zahtevamo dereferenciranje kazalca, naredi tri stvari:

  • Najprej poišče naslov, shranjen v kazalcu.
  • Nato poišče vrsto kazalca, da lahko sklepa o količini pomnilnika za branje. Na primer, 4 byes za int, 1 byte za char itd. To je tudi glavni razlog, zakaj moramo v deklaraciji določiti tip kazalca, čeprav je velikost vsakega kazalca v sistemu enaka.
  • Na koncu prebere pomnilnik in vrne shranjene podatke.

Opomba: Iz zgornje utemeljitve lahko tudi sklepamo, da kazalca praznine ne moremo razimenovati, ker velikost podatkov, na katere kaže, ni znana. Torej moramo vtipkati kazalec praznine, da ga razimenujemo.