КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Багатовимірні масиви
Багатовимірні масиви задаються окремими вимірами в квадратних дужках, наприклад, оператор int matr [3][4]; задає опис двовимірного масиву з 3 рядків та 4 стовпців. У пам'яті такий масив розташовується послідовно по рядках. Тобто в пам’яті будь-який багатовимірний масив розташовується як одновимірний. Двовимірний масив представляє собою константну вказівку, яка збільшується на кількість елементів в кожному рядку масиву. Привласнимо двовимірний масив вказівці.
int matr [3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; int (*mm)[4] = matr;
Тепер перший та другий рядок повністю еквівалентні, з тією відмінністю, що matr – константна вказівка, а mm – ні. Записint (*mm)[4]означає, що при арифметичних операціях з вказівкою, вона збільшується або зменшується на кількість байтів 4-х елементів типу даних int до першого розмикання. Після першого розмикання адреса збільшується на кількість байтів одного елементу int, як у разі звичайної вказівки. Для доступу до елементу багатовимірного масиву вказують всі його індекси, наприклад, matr[i][j], або іншим способом: *(matr[i]+j) або *(*(matr+i)+j). При ініціалізації багатовимірного масиву він представляється або як масив з масивів, при цьому кожен масив береться в свої фігурні дужки (в цьому випадку ліву розмірність при описі можна не вказувати), або задається загальний список елементів в тому порядку, в якому елементи розташовуються в пам'яті:
Як і у випадку роботи з одновимірним масивом, якщо ви ініціалізуєте один або більше елементів, інші – заповнюються нулями. Приклад:
float ss[3][2]={0.0};
всі елементи масиву заповнюються нулями. Наведемо приклад виведення певного елементу двовимірного масиву різними засобами з використанням вказівок.
#include <iostream> using namespace std;
void main() { int ara[][2]={{100,200},{300,400},{500,600}}; int (*mm1)[2] = ara; int *mm2 = (int*)ara;
cout << ara[1][1] <<"\t" <<*(*(ara+1)+1)<<"\n"; cout << mm1[1][1] <<"\t" <<*(*(mm1+1)+1)<<"\n"; cout << (*ara)[3] <<"\t" <<*(*ara+3)<<"\n"; cout << mm2[3] <<"\t" <<*(mm2+3)<<"\n"; }
Результат: 400 400 400 400 400 400 400 400
Змінні int ara[][2] та int (*mm1)[2] представляють собою вказівки, де запис у квадратних дужках показує на скільки елементів треба зміщуватись при арифметичних операціях. У нашому випадку це 2*sizeof(int). Після першого розмикання вказівка буде переміщуватись через 4 байти (sizeof(int)). За допомогою рядку коду int *mm2 = (int*)ara; явно приводимо вказівку ara до типу (int*) після чого з двовимірним масивом можна працювати як з одновимірним. Оператор for є гарним засобом організації доступу до кожного елемента двовимірної таблиці for (row=0;row<2;row++) for (col=0,col<3;col++) cout <<row<" "<<col<<"\u";
Наведемо приклад виведення цін на дискети: Комп’ютерна компанія продає дискети 3.5 і 5.25 дюйма. Кожна дискета буває однієї з 4-х ємностей: односторонніми, подвійної щільності, двосторонніми подвійної щільності, односторонніми підвищеної щільності, двосторонніми підвищеної щільності. #include <iostream> #include <iomanip> using namespace std;
void main() { int row, col; float disk[2][4] = {{2.3f, 2.75f, 3.2f, 3.5f}, {1.75f, 2.1f, 2.6f, 2.95f}}; cout.setf(ios::fixed); cout.setf(ios::showpoint); cout << "\tSingle sided,\tDouble sided," << "\tSingle sided,\tDouble sided,\n"; cout << "\tDouble density\tDouble density" << "\tHigh density \tHigh density \n"; for (row = 0; row < 2; row++) { if(row == 0) cout << "3.5\" \t"; else cout << "5.25\"\t"; for (col = 0; col < 4; col++) cout << "$" << setprecision(2) << disk[row][col] << "\t\t"; cout << "\n"; } }
Результат:
Наступний приклад представляє найбільший інтерес. У ньому продемонстровано як за рахунок приведення вказівок можна перетворити двовимірний масив в одновимірний і навпаки – одновимірний в двовимірний.
#include <iostream> using namespace std; void main() {
int i,j;
|