Char *p; // Неініційований вказывник на об’єкт типу char

Вказівники на об’єкти.

Визначення та оголошення вказівника на змінну має вигляд:

type *ім’я_вказівника;

де type – позначення типу; ім’я_вказівника – ідентифікатор; * - унарна операція розкриття посилання ( операція розйменування; операція звернення за адресою), операндом якої повинен бути вказівник ( саме тому слідом за “*” записане ім’я_вказівника ).

Признаком вказівника при розгляді визначення чи оголошення служить символ “*”, вміщений перед іменем, що означає “вказівник на об’єкт даного типу. Таким чином, при потребі визначити кілька вказівників на об’єкти одного типу цей символ записують перед кожним іменем. Наприклад, визначення int *i1p, *i2p, *i3p, i; вводить три вказівники на об’єкти цілого типу i1p, i2p, i3p та одну змінну і цілого типу.Змінній і відведеться 2 байти пам’яті, а вказівникам i1p, i2p, i3p - дільниця пам’яті, визначена реалізацією, часто 2 байти.

Оскільки при визначенні у більшості випадків доцільно виконати ініціювання, тому формат може бути таким: type *ім’я_вказівника ініціювач;

Ініціювач має дві форми визначення вказівників:

type *ім’я_вказівника= вираз_ініціювання;

type *ім’я_вказівника (вираз_ініціювання);

вираз_ініціювання повинен бути константним виразом, наприклад:

· явно вказана адреса дільниці пам’яті;

· вказівник, якому вже надане значення;

· вираз, що дає змогу одержати адресу об’єкта за допомогою операції ‘&’.

Якщо значення константного виразу дорівнює 0, тоді це нульове значення перетвориться на порожній (нульовий) вказівник. Синтаксис мови “гарантує, що цей вказівник відрізняється від вказівника на довільний об’єкт”. Окрім того, внітрішнє (бітове) відтворення порожнього вказівника може відрізнятися від бітового відтвворення цілого значення 0. У компіляторах ТС++ та ВС++ умовне нульове значення адреси, що відповідає порожньому вказівнику, має позначення NULL. Приклади визначення вказівників:

char cc = ‘d’; //Символьна змінна (типу char)

char *pc = &cc; // Ініційований вказівник на об’єкти типу char

Char *ptr(NULL); // Нульовий вказівник на об’экт типу char

char *p; // Неініційований вказывник на об’єкт типу char

Змінна сс ініційована значенням символьної константи ‘d’. Після визначення (з ініціюванням) вказівника pc доступ до значення змінної cc можливий як через ім’я, так і через адресу, що є значенням вказівника на змінну pc. У останньому випадку застосовується операція розйменування “*” ( одержання значення через вказівник).

Вказівники ptr та p, визначені у прикладі, мають різні “права”. Вказівник ptr має нульове початкове значення (порожній вказівник), і спроба розйменування не виконується.

Порожній вказівник, не поєднаний з дільницею пам’яті, повинен мати нульову адресу і зберігати нульове значення, що не забезпечується синтаксисом мови С++. Проте надавши ptr значення адреси існуючого об’єкта, можна коректно застосовувати операцію розйменування. Наприклад, довільний з операторів надання значення ptr=&cc;чи ptr=pc; поєднає ptr з дільницею пам’яті, відведеної для змінної cc , тобто після їх виконання значенням *ptr буде ‘d’.

Надавши вказівнику адресу конкретної дільниці пам’яті, можна за допомогою операції розйменування не лише читати, але й змінювати її вміст.Наприклад, оператори надання :*pc=’+’; чи ptr=pc; *ptr=’+’;нададуть змінній cc значеня ‘+’.

Унарний вираз *вказівник володіє правами імені змінної, тобто *pc та *ptr є синонімами (псевдонімами, іншими іменами) імені cc. Вираз *вказівник можна використовувати практично скрізь, де допустиме використання імен об’єктів того типу, до якого відноситься вказівник. Проте це ствредження справедливе лише тоді, коли вказівник ініційований при визначенні явним способом. У наведеному прикладі не ініційований вказівник p. Тому спроби використати вираз *p у лівій частині оператора надання чи в операторі введення неправомірні. Значення вказівника p невідоме, а результат запису значення у невизначену дільницю пам’яті непередбачена і іноді призводить до аварійних подій.

*p=’%’ // Помилкове використання неініційованого p.

При наданні вказівнику адреси конкретного об’єкта ( p=&cc;) чи значення вже ініційованого вказівника (p=pc;) *p перетвориться на синонім існуючого імені об’єкта.

Для поєднання неініційованого вказівника з новою дільницею пам’яті, ще не відведеної ніяким об’єктам програми, використовується оператор new чи надаєтсья вказівнику явна адреса: p=new char;

//Відвели пам’ять змінній типу char та поєднали вказівник p з дільницею пам’яті

p=(char *) 0xb8000000;

// Початкова адреса відеопам’яті для кольорового монітора у текстовому режимі

Наши рекомендации