C++/Основи/Складні типи даних

Матеріал з Вікіпідручника
< C++
Перейти до навігації Перейти до пошуку

Складні типи даних[ред.]

Масиви[ред.]

Масив це послідовність елементів одного типу даних, які розміщуються в суміжних комірках пам'яті, до кожного з яких можна доступитися за допомогою індексу, який додається до ідентифікатору. Це означає що, наприклад, для масиву, який складається з 5 значень типу int, не потрібно створювати 5 окремих змінних, де кожна буде з власним ідентифікатором. Замість того, ми можемо зберігати 5 різних значень одного типу, під одним унікальним ідентифікатором.

Наприклад, структура массиву під назвою “array” може бути представлений так:

ArrayView.png

Де кожен пустий прямокутник представляє собою елемент масиву типу int. Ці елементи нумеруються з 0 до 4, оскільки перший індекс масиву завжди 0. Як і звичайний тип даних масив повинен бути оголошений перед використанням. Типовий формат оголошення масиву наступний:

назва_типу ім’я [розмір];

де “назва_типу” це тип даних (такий як int, float...), ім’я це унікальний ідентифікатор і розмір – це кількість елементів в масиві, яка завжди сказується у квадратних дужках. Таким чином, наш массив з 5-и елементів буде створений таким чином:

int array [5];

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

Ініціалізація масивів[ред.]

При створенні звичайних масивів в локальній області видимості (у функції, наприклад), якщо ми не визначемо значення елементів, вони будуть містити випадкові значення, отже їх вміст буде не визначений доки ми не занесемо туди конкретні значення.

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

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

int array [5] = { 1, 2, 4, 8, 16 };

Цей масив буде виглядати так:

ArrayView2.png

Кількість значень між дужками { } не повинна бути більшою ніж розмір масиву, який ми задали раніше. При ініціалізації значень масиву, C++ дозволяє залишити квадратні дужки пустими. В такому випадку, компілятор буде вважати, що розмір масиву відповідатиме кількості заданих значень в фігурних дужках. Наприклад, такий вираз також створить масив з 5-ти елементів:

int array [] = { 1, 2, 4, 8, 16 };

Доступ до елементів масиву[ред.]

Доступ до окремих елементів масиву і операції з ними здійснюються так ніби це звичайна змінна, яку можна модифікувати і зчитувати. Формат доступу до n-го елементу масиву виглядає так:

array[n]

Наприклад: щоб записати значення третього елементу масиву, ми маємо написати:

int array [5] = { 1, 2, 0, 8, 16 }; 
array[2] = 4; // запишемо значення 4 для третього елементу масиву
int a = array[2]; // дістанемо значення третього елементу і запишемо його у змінну a

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

Багатомірні масиви[ред.]

Багатомірні масиви можна описати як "масиви масивів". Наприклад, двомірний масив можна розглядати як таблицю елементів, які мають однаковий тип даних.

Приклад оголошення масиву розміром 3 на 5 виглядатиме так:

int array [3][5];
Twodimarray.png

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

Передача масивів у функції[ред.]

Іноді може бути потрібним передати масив у функцію у вигляді параметру. В C++ не можливо передати повний блок даних у пам’яті по значенню як параметр, але можливо передати його адресу. На практиці це майже те саме, і це навіть більш швидка і ефективна операція. Для того, щоб функція могла прийняти масив як параметр, при оголошенні функції ми повинні для даного переметру вказати тип елементів масиву, ідинтифікатор і порожні квадратні дужки []. Наприклад:

int sum_array (int arg[])

приймає в якості параметра масив цілих чисел з ідентифікатором arg.

Код, кий передаватиме в цю функцію масив буде виглядати так:

int myarray [5] = { 1, 2, 4, 8, 16 };

sum_array (myarray);

Ось повний приклад:

int sum_array (int arg[], int length) 
{
	int result = 0;
	for (int i=0; i<length; i++) 
	{
	 	result+=arg[i];
	}
	return result;
}

int main () 
{ 
	int myarray [5] = { 1, 2, 4, 8, 16 };
	cout << "\n"; 
	cout << "Сума дорівнює:" << sum_array (myarray,5)<< "\n"; 
	return 0; 
}

Оскільки нам треба знати довжину масива, щоб використати у циклі, ми передаємо її за допомогою другого параметру int length.

В функцію можливо передавати також багатовимірні масиви. Формат передачі у функцію параметру багатовимірного масиву буде таким:

base_type identifier[][depth][depth]

Наприклад:

void myprocedure (int myarray[][3][4])

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

Символьні послідовності[ред.]

Оскільки строки являють собою послідовность символів, в C++ ми можемо представити їх у вигляді масивів символів, де кожен елемент буде мати тип char. Наприклад:

char message [20];

Такий масив може зберігати до 20 елементів типу char. Таким чином, в цьому масиві ми можемо зберігати послідовності символів довжиною до 20 літер. Але ми можемо зберігати і коротші послідовності. У змінній message ми можемо зберігати послідовності різної довжини, наприклад, ми можемо зберегти в ній строку “Hello”, або "Wikipedia world", оскільки вони коротше ніж 20 символів. Таким чином, оскільки масив може містити послідовності символів, довжину яких слід якось позначити, застосовується спеціальний символ, який позначає кінець послідовності. Це нульовий символ, константне значення якого можна записати у вигляді літералу '\0' .

Наш масив з 20 елементів, який зберігає вищевказані строки тоді виглядатиме так:

Char arrays.png

Елементи, що знаходяться справа від символу '\0' в даному масиві, не є частиною нашої строки, але оскільки наш масив має фіксовану довжину, вони залишаються зарезервованими в пам'яті.

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

char message[] = { 'H', 'e', 'l', 'l', 'o', '\0' };

В такому випадку ми оголосили масив з 6 елементів типу char, і занесли туди строку зі словом “Hello” плюс символ завершення строки '\0' в кінці. Але символьні масивам можна також задати початкове значення за допомогою строкового літералу, які задаються у вигляді тексту, який записується в подвійних лапках ("). Наприклад :

char message[] = "Hello";

В даному прикладі ми також визначили масив з шести елементів, оскільки строкові літерали завжди містят в собі символ завершення строки ('\0'), який додається автоматично в кінці.