logo

Покажчик розіменування в C

Ми знаємо, що змінна вказівника може зберігати адресу пам’яті мовою C, і в цій статті ми дізнаємося, як використовувати цей вказівник для доступу до даних, що зберігаються в місці пам’яті, на яке вказує вказівник.

Що таке покажчик?

Перш за все, ми переглядаємо, що таке покажчик. Покажчик - це змінна, яка зберігає адресу пам'яті іншої змінної. Покажчик допомагає нам маніпулювати даними в адресі пам'яті, на яку вказує вказівник. Крім того, кілька покажчиків можуть вказувати на ту саму пам'ять.



Розглянемо наступний приклад:

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

Ми зберегли адресу на одному змінна в птр покажчик, а тепер, як отримати доступ до значення, що зберігається в пам’яті за адресою, на яку вказує птр ? Тут у гру вступає розіменування.

Покажчик розіменування в C

Доступ або маніпулювання вмістом, який зберігається в адресі пам’яті, на яку вказує вказівник, за допомогою розіменування або оператора ненаправлення (*) називається розіменуванням вказівника.



Розіменування покажчика в C

Синтаксис розіменування покажчика

Ми використовуємо оператор непрямості (*) як префікс для розіменування покажчика:

 * ( pointer_name )>

Для зміни даних, що зберігаються в пам'яті, ми використовуємо



 * ( pointer_name ) = new_value;>

Слід зазначити, що new_value має бути того самого типу, що й попереднє.

змінити файл linux

Розглянемо наведені вище приклади, де птр вказує на чи, т Доступ до вмісту в адресі пам’яті може отримати оператор розіменування *. Тепер *ptr отримає вміст, що зберігається за адресою 10.

Адреса та значення пам’яті num і ptr виглядатимуть так.

змінна Адреса пам'яті Значення
кількість = 10 202020 рік 10
202021 рік
202022 рік
202023
ptr = &номер 202024 – 202032 роки 202020 рік

Примітка: Ми припустили, що архітектура в наведеному вище прикладі адресована байтами, тобто мінімальною одиницею, яка має окрему адресу, є байт.

Приклади розіменування покажчика

приклад 1:

Використання вказівника для доступу та зміни значення цілочисельної змінної.

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

>

>

Вихід

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: Розіменування подвійного покажчика

Подвійні вказівники також можна розіменувати за тією ж логікою, але вам доведеться використовувати оператор ненаправлення двічі: один для переміщення до вказівника, на який вказує подвійний вказівник, а інший для доступу до фактичного значення.

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

>

>

Вихід

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

Так само ми можемо розіменувати покажчики будь-якого рівня.

Як працює розіменування?

Щоразу, коли ми просимо компілятор розіменувати покажчик, він робить три речі:

  • Спочатку він шукає адресу, збережену в покажчику.
  • Потім він шукає тип покажчика, щоб він міг вивести обсяг пам’яті для читання. Наприклад, 4 байти для int, 1 байт для char тощо. Це також основна причина, чому нам потрібно вказати тип покажчика в декларації, навіть якщо розмір кожного покажчика в системі однаковий.
  • Нарешті, він зчитує пам’ять і повертає збережені дані.

Примітка: З наведених міркувань ми також можемо зробити висновок, що ми не можемо розіменувати покажчик void, оскільки розмір даних, на які він вказує, невідомий. Отже, нам потрібно привести покажчик void, щоб розіменувати його.