ЗНАЕТЕ ЛИ ВЫ?

Розміщення одномірного масиву в пам’яті



Для C++ ім’я масиву є дійсною адресою, по якій в пам’яті знаходиться перший елемент масиву. Припустимо, що ви визначаєте масив з ім’ям amo:

 

int amo[6]={4,1,3,7,9,2};

 

 
 

На рисунку 3 показано, як масив розміщується в пам’яті.

 

Рис.3. Розміщення масиву amo у пам’яті.

 

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

Записи amo[3] і (amo+3)[0] ідентичні.

У кожній із таких рядків відбувається звертання до 4-го елемента масива.

(amo+0)[3]

(amo+2)[1]

(amo-2)[5]

(1+amo)[2]

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

Приклад:

 

char nam[]={’T’,’e’,’d’,’\0’,’E’,’v’,’a’,’\0’,

’S’,’a’,’m’,’\0’};

 

Номер елемента Значення
[0] T
[1] Е
[2] D
[3] \0
[4] E
[5] V
[6] A
[7] \0
[8] S
[9] A
[10] M
[11] \0

 

cout <<nam; //Надрукує Ted

cout <<nam+4; //Надрукує Eva

cout <<nam+8; //Надрукує Sam

 

Особливості:

– Незважаючи на те, що C++ автоматично не заносить у пам’ять нулі (або які-небудь інші значення), якщо ви під час оголошення ініціалізуєте декілька елементів (але не усе), інші заповнюються нулями.

– На відміну від інших мов, C++ дозволяє вам привласнити значення незарезервовані членам масиву. Але це не варто робити, тому що ви зіпсуєте інші дані або код.

Так не можна: int cout[];

Так можна int cout[]={1,2,3};

– Використання визначальних констант (#define) має переваги. При недостачі елементів у масиві можна змінити тільки один рядок у #define.

 

Багатомірні масиви і їхнє розміщення в пам’яті

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

Визначення багатомірних масивів

 

int a[5]={8,5,3,25,41};//одномірний

int aa[2][4] = // двомірний

{

{4,3,2,1},

{1,0,5,4}

};

 

I-й варіант II-й варіант
int aaa[3][2]= { {5,4}, {7,1}, {3,0} }; Іnt aaa[3][2]= {5,4,7,1,3,0};

 

Багатомірні масиви (якщо вони не глобальні) не ініціалізуються під час оголошення, якщо ви самі не привласните їм які-небудь значення при оголошенні або пізніше в програмі. Як і у випадку одномірного масиву, якщо ви ініціалізуєте один або більше елементів, але не усе, інші заповнюються нулями.

Приклад:

float ss[3][4][2]={0.0};

всі елементи масиву заповнюються нулями.

 
 

Подивимося, як багатомірний масив розглядається компілятором. На рисунку показано, яким чином розміщується в пам’яті таблиця розміром 4 на 4, тобто масив arr[4][4] (рис. 4.).

Рис.4 Розміщення двовимірного масиву в пам’яті

Вкладені цикли.

 

Оператор for є гарним засобом організації доступу до кожного елемента багатомірної таблиці

 

for (row=0;row<2;row++)

for (col=0,col<3;col++)

cout <<row<" "<<col<<"\u";

 

Приклад виведення цін на дискети:

Комп’ютерна компанія продає дискети 3.5 і 5.25 дюйма. Кожна дискета буває однієї з 4-х ємкостей: односторонніми, подвійної щільності, двосторонніми подвійної щільності, односторонніми підвищеної щільності, двосторонніми підвищеної щільності.

 

#include <iostream.h>

#include <iomanip.h>

 

Void main()

{

int row, col;

float disk[2][4] =

{{2.3, 2.75, 3.2, 3.5},

{1.75, 2.1, 2.6, 2.95}};

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";

}

}

 

Результат:

 

  Single sided, Double density Double sided, Double density Single sided, High density Double sided, High density
3.5 $2.30 $2.75 $3.20 $3.50
5.25 $1.75 $2.10 $2.60 $2.95

 

 





Последнее изменение этой страницы: 2017-02-10; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.232.146.10 (0.01 с.)