Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

6.4.5. Покажчики і рядкові літерали

Можливо, Вас здивує спосіб оброблення С++-компіляторами рядкових літералів, подібних до такого:

cout << strlenf' С++-компілятор");

Якщо С++-компілятор виявляє рядковий літерал, то він зберігає його в таблиці рядків програми і генерує покажчик на потрібний рядок. Тому наведений нижче код програми є абсолютно коректною, у процесі виконання якої на екран виводиться фраза "Робота з покажчиками – суцільне задоволення!".

Код програми 6.10. Демонстрація роботи з рядковими літералами

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

int main()

{

char *s;

s = "Робота з покажчиками – суцільне задоволення!\n";

cout << s;

getch(); return 0;

}

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

Таблиця рядків – це таблиця, що згенерується компілятором для зберігання рядків, що використовуються у програмі.

Оскільки покажчик на таблицю рядків конкретної програми під час використання рядкового літерала генерується автоматично, то можна спробувати використовувати цей факт для модифікації вмісту цієї таблиці. Проте таке рішення навряд чи можна назвати вдалим. Йдеться про те, що С++-компілятори створюють оптимізовані таблиці, у яких один рядковий літерал може використовуватися в двох (або більше) різних місцях програми. Тому "насильницька" зміна рядка може викликати небажані побічні ефекти. Понад це, рядкові літерали є константами, і деякі сучасні С++-компілятори просто не дають змоги змінювати їх вміст. А під час спроби зробити це С++-компілятор згенерує помилку тривалості виконання.

6.4.5. Приклад порівняння покажчиків

Вище ми вже наголошували на тому, що значення одного покажчика можна порівнювати з іншим. Але, щоб порівняння покажчиків мало сенс, порівнювані покажчики мають бути якимсь чином пов'язані один з одним. Найчастіше такий зв'язок встановлюється у разі, коли обидва покажчики вказують на елементи одного і того ж масиву. Наприклад, дано два покажчики (з іменами А і В), які посилаються на один і той самий масив. Якщо А менше ніж В, значить, покажчик А вказує на елемент, індекс якого менше від індексу елемента, яка адресується покажчиком В. Таке порівняння особливо корисне для визначення граничних умов.

Порівняння покажчиків продемонстровано у наведеному нижче коді програми, у якій створюються дві змінні типу покажчика. Одна (з іменем start) спочатку вказує на початок масиву, а друга (з іменем end) – на його кінець. У міру введення користувачем чисел масив послідовно заповнюється від початку до кінця. Кожного разу, коли в масив вводиться чергове число, покажчик start інкрементується. Щоб визначити, чи заповнився масив, у програмі просто порівнюються значення покажчиків start і end. Коли start перевищить end, то масив буде заповнений "повністю". Програмі залишиться тільки вивести вміст заповненого масиву на екран.

Код програми 6.11. Демонстрація порівняння покажчиків

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

int main()

{

int num[10];

int *start, *end;

start = num;

end = &num[9];

while(start <= end) {

cout << "Введіть число: ";

cin >> *start;

start++;

}

start = num; // Відновлення початкового значення покажчика

while(start <= end) {

cout << *start << " ";

start++;

}

getch(); return 0;

}

Як показано у цій програмі, оскільки start і end обидва вказують на спільний об'єкт (у цьому випадку ним є масив num), то їх порівняння може мати сенс. Подібне порівняння часто використовують у професійно написаному С++-коді програми.