Tiedämme, että osoitinmuuttuja voi tallentaa muistiosoitteen C-kielellä, ja tässä artikkelissa opimme käyttämään osoitinta osoittimen osoittamaan muistipaikkaan tallennettujen tietojen käyttämiseen.
Mikä on osoitin?
Ensinnäkin tarkistamme, mikä on osoitin. Osoitin on muuttuja, joka tallentaa toisen muuttujan muistiosoitteen. Osoitin auttaa meitä käsittelemään osoittimen osoittaman muistiosoitteen tietoja. Lisäksi useat osoittimet voivat osoittaa samaan muistiin.
hashset java
Harkitse seuraavaa esimerkkiä,
int num = 10; int *ptr; ptr = #>
Olemme tallentaneet osoitteen yhdellä muuttuja kohdassa ptr osoitinta, mutta nyt kuinka päästään osoittamaan osoitteeseen muistiin tallennettuun arvoon ptr ? Tässä tulee esiin viittausten poistaminen.
Viittausosoitin C:ssä
Osoittimen osoittamaan muistiosoitteeseen tallennetun sisällön käyttämistä tai käsittelemistä käyttämällä viittauksenpoisto- tai epäsuoraoperaattoria (*) kutsutaan osoittimen viittauksen purkamiseksi.
Viittauksen poisto osoitin C:ssä
Syntaksi osoittimen viittauksen poistamiseen
Käytämme indirection-operaattoria (*) etuliitteenä osoittimen viittauksen poistamiseen:
* ( pointer_name )>
Käytämme muistiin tallennettujen tietojen muokkaamiseen
* ( pointer_name ) = new_value;>
On huomattava, että new_value on oltava samaa tyyppiä kuin edellinen.
Harkitse yllä olevia esimerkkejä missä ptr pisteet onko, t Muistiosoitteen sisältöön pääsee käsiksi viittauksenpoistooperaattori *. Nyt *ptr hakee osoitteeseen, joka on 10, tallennetun sisällön.
Num- ja ptr-muistin osoite ja arvot näyttävät tältä.
| Muuttuva | Muistin osoite | Arvo |
|---|---|---|
| numero = 10 | 202020 | 10 |
| 202021 | ||
| 202022 | ||
| 202023 | ||
| ptr = &nm | 202024-202032 | 202020 |
Huomautus: Olemme olettaneet, että yllä olevan esimerkin arkkitehtuuri on tavuosoitteellinen eli minimiyksikkö, jolla on erillinen osoite, on tavu.
Esimerkkejä osoittimen viittauksen poistamisesta
Esimerkki 1:
Osoittimen käyttäminen kokonaislukumuuttujan arvon avaamiseen ja muokkaamiseen.
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;> }> |
>
>
Lähtö
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>
Esimerkki 2: Kaksoisosoittimen viittauksen poistaminen
Kaksoisosoittimien viittaukset voidaan myös purkaa samalla logiikalla, mutta joudut käyttämään epäsuoraa operaattoria kaksi kertaa: Toista siirryttäessä kaksoisosoitin osoittamaan osoittimeen ja toisella päästäksesi todelliseen arvoon.
C
java-kytkinkotelo
// 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;> }> |
>
>Lähtö
Accesing value from double pointer using **dptr: 10>
Juuri näin, voimme jättää viittauksen minkä tahansa tason osoittimiin.
Miten viittauksen poistaminen toimii?
Aina kun pyydämme kääntäjää poistamaan viittauksen osoittimeen, se tekee kolme asiaa:
- Se etsii ensin osoittimeen tallennetun osoitteen.
- Sitten se etsii osoittimen tyyppiä, jotta se voi päätellä luettavan muistin määrän. Esimerkiksi 4 byes int:lle, 1 tavu charille jne. Se on myös tärkein syy, miksi meidän on määritettävä osoittimen tyyppi ilmoituksessa, vaikka järjestelmän jokaisen osoittimen koko on sama.
- Lopuksi se lukee muistin ja palauttaa tallennetut tiedot.
Huomautus: Yllä olevasta päättelystä voimme myös päätellä, että emme voi jättää viittausta tyhjään osoittimeen, koska sen osoittaman datan kokoa ei tunneta. Joten meidän on kirjoitettava tyhjä osoitin, jotta voimme purkaa siihen viittaamisen.