Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Доступ до змінної по вказівнику

Недоліки синтаксису

Треба зауважити, що загальноприйняте визначення вказівника за допомогою змінної, що пишеться перед іменем змінної, а не після назви типу

 

char *charptr;

Це не принципово для компілятора, але зірочка, розміщена відразу після назви типу змінної, сигналізує про те, що це не просто тип, а вказівник на нього.

Якщо ми визначаємо в одному рядку більше, ніж один вказівник того самого типу, то зірочку необхідно ставити перед іменем кожної змінної.

char* ptr1, * ptr2, * ptr3;

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

char *ptr1, *ptr2, *ptr3;

Вказівнику обов’язково повинне бути присвоєне якесь значення, інакше випадкова адреса, на яку він вказує, може виявитися чим завгодно: від коду програми до коду операційної системи. Неініціалізований вказівник може привести до краху системи, його тяжко виявити в процесі відлагодження, оскільки компілятор не сигналізує про помилку. Тому дуже важливо переконатися, що кожному вказівнику перед його використанням повинне бути присвоєне значення.

 

Припустімо, що ми не знаємо змінної, але знаємо її адресу. Чи можемо ми дістати доступ до значення цієї змінної?

Існує спеціальний запис, призначений для доступу до значення змінної, використовуючи її адресу замість імені. В приведеній далі програмі показано, як це можна зробити.

 

#include<iostream>

using namespace std;

int main()

{ int var1=11;

int var2=22;

cout<<&var1<<endl

<<&var2<<endl;

 

int* ptr; //вказівник на ціле число

ptr=&var1;

cout<<*ptr<<endl;

 

ptr=&var2;

cout<<*ptr<<endl;

 

return 0;

}

Ця програма схожа на попередню за винятком того, що замість виведення на екран адрес, що зберігаються в змінній ptr, ми виводимо значення, які зберігаються за цією адресою. Вираз *ptr дозволяє нам одержати значення змінних var1 і var2.

Зірочка, яка стоїть перед іменем змінної, як у виразі *ptr, називається операцією розіменуванняю Цей запис означає таку дію: взяти значення змінної, на яку вказує вказівник. Таким чином, вираз *ptr являє собою значення змінної, на яку вказує вказівник ptr.

Вказівники можна використовувати не лише для одержання значень змінної, на яку він вказує, але й для виконання дій з цими змінними. Далі приведена програма використовує вказівник для присвоєння значень одній змінній, а потім іншій:

 

#include<iostream>

using namespace std;

int main()

{ int var1,var2;

int* ptr;

ptr=&var1;

*ptr=37;

var2=*ptr;

cout<<var2<<endl;

return 0;

}

 

Варто також запам’ятати, що зірочка, використовувана в операції розіменування – це не те саме, що зірочка, використовувана при оголошенні вказівника. Операція розіменування попереджає ім’я змінної і означає значення, що знаходиться в змінній, на яку вказує вказівник. Натомість зірочка в оголошенні вказівника означає вказівник на.

 

int* ptr; //оголошення вказівника на int

*ptr=37; //розіменування значення змінної

Доступ до значення змінної, яка зберігається за адресою, з використанням операції розіменування називається непрямим доступом або розіменованим доступом.

Розглянемо невеличкий приклад

int v; //оголошення змінної типу int

int* p;//визначаємо змінну типу вказівник на int

p=&v; //присвоюємо змінній p значення адреси змінної v

v=3; //присвоюємо v значення 3

*p=3; //робимо те саме, але через вказівник

 

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

 

<== предыдущая лекция | следующая лекция ==>
Змінні вказівники | Вказівники-константи і вказівники-змінні
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 372; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.