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

6.4.1. Основні відмінності між індексуванням елементів масивів і арифметичними операціями над покажчиками

У мові програмування C++ передбачено два способи доступу до елементів масивів: за допомогою індексування елементів масивів і арифметики покажчиків. Йдеться про те, що арифметичні операції над покажчиками іноді виконуються швидше, ніж індексування елементів масивів, особливо під час доступу до елементів, розташування яких відрізняється строгою впорядкованістю. Оскільки швидкодія часто є визначальним чинником при виборі тих або інших рішень під час програмування, то використання покажчиків для доступу до елементів масиву – характерна особливість багатьох С++-програм. Окрім того, іноді покажчики дають змогу написати дещо компактніший код програми порівняно з використанням індексування елементів масивів.

Щоб краще зрозуміти відмінність між індексуванням елементів масивів і арифметичними операціями над покажчиками, розглянемо дві версії однієї і тієї ж самої програми. У наведеному нижче коді програми з рядка тексту виділяють слова, розділені між собою пропусками. Наприклад, з рядка "Привіт, друг" програма повинна виділити слова "Привіт" і "друг". Програмісти зазвичай називають такі розмежовані символьні послідовності лексемами (token). У процесі виконання програми вхідний рядок посимвольно копіюється в інший масив (з іменем token) доти, доки не трапиться пропуск. Після цього виділена лексема виводиться на екран, і процес триває доти, доки не буде досягнуто кінця рядка. Наприклад, якщо як вхідний рядок використовувати рядок "Це тільки простий тест.", то програма відобразить таке:

Це

тільки

простий

тест.

Ось як виглядає версія програми поділу рядка на слова з використанням арифметичних покажчиків.

Код програми 6.5. Демонстрація поділу рядка на слова з використанням арифметичних покажчиків

#include <vcl>

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

#include <conio> // Для консольного режиму роботи

#include <cstdio> // Для підтримки системи введення-виведення

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

int main()

{

char strMas[80];

char token[80];

char *p, *q;

cout << "Введіть речення: ";

gets(strMas);

p = strMas;

// Зчитуємо лексему з рядка.

while(*p) {

q = token; // Встановлюємо q для вказівки

// на початок масиву token.

/* Зчитуємо символи доти, доки не трапиться або пропуск,

або нульовий символ (ознака завершення рядка). */

while(*p !=' ' && *p) {

*q = *p;

q++;

p++;

}

if(*p) p++; // Переміщаємося за пропуск.

*q = '\0'; // Завершуємо лексему нульовим символом.

cout << token << "\n";

}

getch(); return 0;

}

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

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

#include <vcl>

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

#include <conio> // Для консольного режиму роботи

#include <cstdio> // Для підтримки системи введення-виведення

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

int main()

{

char strMas[80];

char token[80];

int i, j;

cout << "Введіть речення: ";

gets(strMas);

// Зчитуємо лексему з рядка.

for(i=0;; i++) {

// Зчитуємо символи доти, доки не трапиться пропуск,

// або нульовий символ (ознака завершення рядка).

for(j=0; strMas[i] !=' ' && strMas[i]; j++, i++)

token[j] = strMas[i];

token[j] = '\0'; // Завершуємо лексему нульовим символом.

cout << token << "\n";

if(!strMas[i]) break;

}

getch(); return 0;

}

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