Mēs zinām, ka rādītāja mainīgais var saglabāt atmiņas adresi C valodā, un šajā rakstā mēs uzzināsim, kā izmantot šo rādītāju, lai piekļūtu datiem, kas glabājas rādītāja norādītajā atmiņas vietā.
Kas ir rādītājs?
Pirmkārt, mēs pārskatām, kas ir rādītājs. Rādītājs ir mainīgais, kas saglabā cita mainīgā lieluma atmiņas adresi. Rādītājs palīdz mums manipulēt ar datiem atmiņas adresē, uz kuru norāda rādītājs. Turklāt vairākas norādes var norādīt uz vienu un to pašu atmiņu.
Apsveriet šādu piemēru,
int num = 10; int *ptr; ptr = #>
Mēs esam saglabājuši adresi uz viena mainīgais ptr rādītājs, bet tagad, kā piekļūt atmiņā saglabātajai vērtībai norādītajā adresē ptr ? Šeit tiek izmantota atsauces atcelšana.
Atsauces rādītājs C
Piekļuve saturam, kas tiek saglabāts atmiņas adresē, uz kuru norāda rādītājs, izmantojot atsauces atcelšanas vai novirzīšanas operatoru (*), tiek saukta par rādītāja atsauces atcelšanu.
Atsauces atcelšanas rādītājs valodā C
Sintakse rādītāja atsauces atcelšanai
Mēs izmantojam netiešās darbības operatoru (*) kā prefiksu, lai atsauktu rādītāju:
* ( pointer_name )>
Atmiņā saglabāto datu modificēšanai mēs izmantojam
* ( pointer_name ) = new_value;>
Jāņem vērā, ka parametram new_value ir jābūt tāda paša veida kā iepriekšējam.
Apsveriet iepriekš minētos piemērus, kur ptr norāda uz vai, t Atmiņas adreses saturam var piekļūt atsauces noņemšanas operators *. Tagad *ptr ienesīs saturu, kas saglabāts adresē, kas ir 10.
Num un ptr atmiņas adrese un vērtības izskatīsies šādi.
| Mainīgs | Atmiņas adrese | Vērtība |
|---|---|---|
| skaits = 10 | 2020. gads | 10 |
| 202021. gads | ||
| 202022. gads | ||
| 202023. gads | ||
| ptr = &nr | 202024–202032 | 2020. gads |
Piezīme: Mēs esam pieņēmuši, ka arhitektūra iepriekš minētajā piemērā ir adresējama ar baitu, t.i., minimālā vienība, kurai ir atsevišķa adrese, ir baits.
Rādītāja novirzīšanas piemēri
1. piemērs:
Rādītāja izmantošana, lai piekļūtu un mainītu vesela skaitļa mainīgā vērtību.
C
cik liels ir mans datora ekrāns
// 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;> }> |
>
>
Izvade
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. piemērs: dubultā rādītāja atsauces atcelšana
Divkāršās norādes var arī noņemt, izmantojot to pašu loģiku, taču jums būs divas reizes jāizmanto novirzīšanas operators: viens, lai pārvietotos uz rādītāju, uz kuru norāda dubultā rādītājs, un otrs, lai piekļūtu faktiskajai vērtībai.
java pārvērš veselu skaitli par virkni
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;> }> |
>
>Izvade
Accesing value from double pointer using **dptr: 10>
Tieši tāpat mēs varam atsaukt jebkura līmeņa norādes.
Kā darbojas atsauces atcelšana?
Ikreiz, kad mēs lūdzam kompilatoram atsaukt uz rādītāju, tas veic trīs lietas:
- Vispirms tā meklē kursorā saglabāto adresi.
- Pēc tam tas meklē rādītāja veidu, lai varētu secināt lasāmās atmiņas apjomu. Piemēram, 4 byes int, 1 baits char utt. Tas ir arī galvenais iemesls, kāpēc mums ir jānorāda rādītāja veids deklarācijā, lai gan katra rādītāja lielums sistēmā ir vienāds.
- Visbeidzot, tas nolasa atmiņu un atgriež saglabātos datus.
Piezīme: No iepriekš minētā sprieduma mēs varam arī secināt, ka mēs nevaram atsaukt tukšo rādītāju, jo nav zināms datu lielums, uz kuriem tas norāda. Tāpēc mums ir jāievada tukšais rādītājs, lai uz to noņemtu atsauci.