Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Posibnyk_C.doc
Скачиваний:
23
Добавлен:
03.11.2018
Размер:
1.56 Mб
Скачать

6 Складні типи даних

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

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

З курсу лінійної алгебри відомо, що за вимірністю масиви бувають одновимірні (вектор), двовимірні (матриця), тривимірні (тензор) і т.д. У програмуванні найчастіше використвуються одновимірні та двовимірні масиви. Більшість сучасних мов програмування дозволяють обробляти масиви будь-якої вимірності. Мова Сi відрізняється від них тим, що дозволяє використовувати тiльки одновимiрні масиви даних, а багатовимірні розглядаються як одновимірні масиви одновимірних масивів. Це, однак, як буде показано нижче, не є її недоліком, а навпаки надає їй ширших можливостей.

Так само, як прості, дані складних типів підлягають оголошенню в програмі. Ознакою масиву пiд час його оголошення є квадратнi дужки, якi ставляться пiсля iдентифiкатора масиву, в дужках вказується кiлькiсть елементiв масиву. Мiнiмальне значення iндекса (порядкового номера) елемента масиву завжди дорiвнює нулю. Це відрізняє С від інших мов програмування таких, як Паскаль, Бейсик, де початковий номер елемента можна змінювати. Пiд час оголошення масив може бути iнiцiалiзований. Наведемо декілька прикладів.

char h[]="Система", t[25], s[9]="Комп'ютер";

float a[20], b[5][3];

float c[2][3]={{2, 3, 7}, {6, , 1.2}}; або

float c[2][3]={2, 3, 7, 6, 1e-4, 1.2}; – задані всі елементи.

Тут для масиву h буде зарезервовано в пам’ятi мiсце для зберiгання 8 букв типу char – на одну більше, ніж це потрібно для слова Система, в цьому випадку компiлятор автоматично додасть до масиву нуль '\0' – машинний нуль. Під час операцій вводу-виводу та деяких інших компілятор не підраховує кількість елементів масиву, а використовує цей нуль, як ознаку його кінця.

Масив h можна було оголосити інакше так:

char h[8];

та ініціалізувати шляхом присвоєння: h[0]='С'; h[1]='и'; h[2]='с'; ... h[6]='а';

Масиви t i s займуть вiдповiдно 25 i 9 комiрок пам’ятi типу char. Подібно до масиву h, вектор s буде iнiцiалiзований, проте вiн не буде доповнений нульовим елементом, оскільки під час оголошення для нього не було зарезервовано місце. В будь-якому місці програми машинний нуль можна примусово встановити наприкінці масиву s, наприклад, так: s[8]='\0'; Але тоді його остання буква р буде стертою, замість неї запишеться нуль.

Особливо треба наголосити на тому, що під час оголошення для масиву s відведено 9 комірок типу char, а порядковий номер його останнього індекса дорівнює лише 8, оскільки нумерація елементів починається з 0. Неврахування цього часто спричиняє виникнення помилок у програмі.

Для масиву a буде видiлено 20, масиву b – 15, а масиву c – 6 комiрок пам’ятi типу float. Пiд час оголошення вiдбудеться iнiцiалiзацiя масиву c п’ятьма елементами, тобто c[0][0]=2, c[0][1]=3, c[0][2]=7, c[1][0]=6 та c[1][2]=1.2. Елемент c[1][1] не буде ініціалізованим, але йому буде зарезервовано відповідне місце. Зауважимо лише, що не всі компілятори забезпечують можливість пропуску елементів.

Рядки багатовимірного масиву розташовуються в пам’яті один за другим у порядку оголошення.

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

Використання масивів у програмі покажемо на прикладі. Нехай необхідно обчислити суми рядків цілочислової матриці m порядку 3×4 і результат представити у вигляді вектора p. Матриця m має вигляд:

Алгоритм розв’зування поставленої тут задачі показаний на рисунку 6.1. Він являє собою два вкладені цикли з накопиченням суми.

Зовнішній цикл (блоки 2 – 6) служить для перебору рядків матриці m, його параметр i змінюється від 0 до 2 – за кількістю рядків. У ньому відбувається присвоєння черговому елементу pi нульового значення елемента i-го рядка, тобто pi=mi0 (блок 3), виконання внутрішнього циклу (блоки 4–5) та вивід чергового значення pi (блок 6). У внутрішньому циклі з параметром j – переглядаються стовпчики від 1-го до 3-го та накопичується сума pi. Його параметр змінюється від 1 до 3, а не від 0, нульовий елемент враховується на початку цього циклу.

Він реалізований програмою masyv, її ідентифікатори називаються так само, як у графічному алгоритмі. На початку програми оголошені дві змінні: i та j, які служать параметрами циклів, а також матриця m і вектор p. Всі вони мають цілий тип, оскільки елементи заданої матриці – цілі числа, а змінні i та j використовуються ще й як індекси елементів.

#include<stdio.h> /* masyv */

int main(void)

{

int i, j, p[3], m[3][4]={{2, 3, 1, 6},

{2, 2, 1, 2},

{3, 2, 3, 3}};

for(i=0;i<3;i++)

{

p[i]=m[i][0];

for(j=1; j<4; j++)p[i]+=m[i][j];

printf("p(%d)=%2d\n", i, p[i]);

}

getch();

return(0);

}

Результати, видані програмою, матимуть такий вигляд:

p(0)=12

p(1)= 7

p(2)=11

Виконавши паралельні обчислення вручну, переконуємося в тому, що програма спрацювала вірно.

У програмі masyv матрицю m ініціалізовано під час оголошення. ЇЇ елементи можна було вводити й під час виконання програми за допомогою такої конструкції:

for(i=0; i<3; i++)for(j=0; j<4; j++)scanf("%d", &m[i][j]);

Якщо значення масиву не регламентовані, наприклад, програма має навчальний характер подібно до програми masyv, то можна використати функцію random(n), яка генерує цілі псевдовипадкові числа від 0 до n-1. Тоді програму masyv слід доповнити такими операторами:

#include<stdlib.h>

randomize();

for(i=0; i<3; i++)for(j=0; j<4; j++)m[i][j]=random(12);

Отже, маємо чотири способи ініціалізації масиву: під час оголошення та за допомогою операторів присвоєння, функцій вводу, таких, наприклад, як scanf() або генератора випадкових чисел.

Вказівник являє собою комірку пам’яті типу адреси, в яку можна записати адресу об’єкта. Для роботи з вказівниками використовуються операції адресації та непрямої адресації, розглянені в розділі 2.6.

Вказівники знайшли широке застосування для роботи з масивами, більше того, ідентифiкатор масиву сприймається компiлятором, як адреса його першого елемента, тому фрагменти

float *p, m[7]; p=&m[0]; та

float *p, m[7]; p=m;

виконаються однаково. Тут p – змінна адресного типу, вона приймає значення адреси першого елемента масиву m.

Оскільки p=m, то ці змінні можна й використовувати однаково – p, як m, а m – замість p. Крім того, вказівник дозволяє накладати масиви один на другий, якщо вони розташовані поряд, подібно до того, як це було зроблено з простими змінними у прикладі розділу 2.6. Програма Vkaziv демонструє ці можливості, вона видасть 8 чисел масивів m і k, тобто числа: 66 77 88 11 22 33 44 55 у 4 стовпчики (4-ма різними способами).

#include<stdio.h> /* Vkaziv */

int main(void)

{int m[3]={66, 77, 88}, k[5]={11, 22, 33, 44, 55}, i, *p=m;

for(i=0; i<8; i++)printf(" %d %d %d %d\n", p[i], k[i-3], *(p+i), *(m+i));

getch();

return(0);

}

Застосування вказівника замість імені масиву можливе, однак, лише під час обробки одновимірних масивів. Вище було вже сказано, що багатовимірний масив мовою С розглядається, як одновимірний масив одновимірних масивів, а, оскільки ім’я масиву є вказівником на масив, то воно є масивом вказівників на одновимірні масиви. Цей на перший погляд малозрозумілий висновок демонструє програма Masyv vkaz, складена за постановкою вищерозгляненої задачі про суму елементів рядків матриці, вона видасть той же результат (три числа: 12, 7 і 11).

#include<stdio.h> /* Masyv vkaz */

int main(void)

{

int i,j,p[3],m[3][4]={{2, 3, 1, 6},

{2, 2, 1, 2},

{3, 2, 3, 3}};

for(i=0; i<3; i++)

{

*(p+i)=*m[i];

for(j=1; j<4; j++)*(p+i)+=*(m[i]+j);

printf("p(%d)=%2d\n", i, *(p+i));

}

getch();

return(0);

}

Тут ім’я масиву p застосовується як вказівник на масив p, а ім’я m[3] як масив 3-х вказівників на одновимірні масиви довжиною по 4 елементи. Порівнявши використання p і m[i], можна переконатися в тому, що в обох випадках воно однакове, різниця полягає лише в тому, що p – адреса, а m[i] – елемент масиву типу адреси (масиву адрес).

Масив вказівників програми Masyv vkaz можна було й оголосити, наприклад, так: int i,j,*p,*m[3]; Але тоді неможливою стає ініціалізація масиву m під час оголошення, бо це вже не масив елементів матриці, а масив адрес, її прийшлося б виконувати за допомогою операцій присвоєння, наприклад, так: *m[0]=2; *(m[0]+1)=3; *(m[0]+2)=1; i т.д.

Аналізуючи цей приклад, стає зрозумілим чому мова С оперує лише таким поняттям, як одновимірниий масив даних, це дозволяє спростити роботу з вказівниками.

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

Динамічні масиви дозволяють вирішити цю проблему за допомогою функції malloc(), приклад її застосування демонструє програма malloc. Нижче за текстом знаходяться видані нею результати.

#include<stdio.h> /* malloc */

#include<stdlib.h>

int main(void)

{int m, i, *q;

while(puts("Введіть кільк. ел. масиву ") && scanf("%d", &m))

{

q=malloc(m*sizeof(int));

printf("Адреса масиву=%p\n", q);

if(q==NULL){puts("Немає пам’яті \n"); exit(1);}

printf("Введіть %d елементи масиву: ", m);

i=0;

while(i<m && scanf("%d",&q[i])==1)++i;

printf("Введено %d елементи: ", i);

for(i=0; i<m; i++)printf("%d ", q[i]);

free(q);

}

getch();

return(0);

}

Результати виконання програми malloc:

Введіть кільк. ел. масиву

2

Адреса масиву=094E

Введіть 2 елементи масиву:

22 33

Введено 2 елементи: 22 33

Введіть кільк. ел. масиву

3

Адреса масиву=094E

Введіть 3 елементи масиву:

44 55 66

Введено 3 елементи: 44 55 66

Введіть кільк. ел. масиву

k

Результати запуску програми malloc при m=0.

Введіть кільк. ел. масиву

0

Адреса масиву=0000

Немає пам’яті

На початку програми за допомогою директиви #include під’єднується файл stdlib.h, що дозволяє використовувати функцію malloc(). Всередині програмного блоку оголошено три змінні типу int: m – кількість елементів масиву, i – лічильник (параметр циклу) та вказівник *q.

Програма зациклена оператором while(puts("Введіть кільк. ел. масиву ") && scanf("%d",&m)) так, що відбувається вихід з нього у випадку некоректного вводу m, наприклад, якоїсь букви замість числа цілого типу. Це зроблено з метою демонстрації декількаразового замовлення пам’яті під масиви різної довжини.

Оператор q=malloc(m*sizeof(int)); є головним у програмі, саме він виділяє пам’ять для m елементів масиву. Функція malloc() видає адресу початку блоку пам’яті, цю адресу присвоєно вказівнику q, після чого її можна використовувати для ініціалізації масиву та у виразах. З метою візуального контролю за ходом виконання цього процесу адреса виводиться на екран оператором printf("Адреса масиву=%p\n",q); Функція її виводу містить специфікатор p, він служить для виводу адрес у 16-й системі числення.

Якщо потрібна кількість пам’яті не знайдена, функція malloc() видає адресу NULL, а програма повідомляє, що Немає пам’яті, і відбувається її примусове закінчення за допомогою функції exit(1). Ця функція може приймати і передавати в операційну систему два значення параметра: 1 – у випадку помилки або 0 – програма завершилася успішно.

Два цикли, один типу while, а другий – for, вкладені в зациклений блок while, служать для вводу та виводу нового масиву q (нагадаємо, що вказівник на масив є його ім’ям).

Другим важливим складником програми є функція free(), яка звільняє виділений функцією malloc() блок і повертає його у загальний пул для якогось іншого використання. ЇЇ викликом завершується зациклений блок while.

Аналізуючи видані програмою malloc результати, бачимо, що цей блок був виконаний три рази. За першим разом був утворений масив довжиною 2 елементи, за другим – 3, а за третім через ввід букви k замість числа відбулося його завершення. Під час кожного з перших двох разів то відводилася пам’ять для різних масивів, то звільнялася, тобто одна й та ж область пам’яті використовувалася повторно. Про повторне використання пам’яті свідчить той факт, що обидва масиви починалися з однієї і тієї ж адреси, яка дорівнювала 094E.

Ввід значення 0 змінної m теж спричиняє видачу функцією malloc() адреси NULL і закінчення програми, про це говорять результати запуску програми malloc при m=0.

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

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

Мова С належить до так званих структурованих мов програмування і саме структура надала їй цю назву. Крім розглянених типів, об’єктно-орієнтовані мови програмування, зокрема мова С++, мають класи, які базуються на структурі. За типом складників клас відрізняється від неї тим, що може містити ще й функції, що надає йому ширші властивості.

Структура являє собою блок, її оголошення має такий вигляд:

struct тег{оголошення складників структури}ім’я структури;

В цьому оголошенні, крім власне структури, на ім’я якої можна посилатися в програмі, вказано ще й тег. Його можна використовувати для створення інших структур того ж типу. Тег – не структура, а лише тип структури.

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

#include<stdio.h> /*structura */

int main(void)

{

struct robota{char priz[15];

int rob[2];

float zarp;

unsigned :6;

unsigned b:2;}tokar={"Петренко П.П.", { 7, 64}, 45.50, 03};

int *c=tokar.rob;

printf("Пріз=%s Год=%d Кіл=%d Зар=%f b=%d\n",

tokar.priz, *c, *(c+1), tokar.zarp, tokar.b);

getch();

return(0);

}

У цій програмі оголошена та ініціалізована структура tokar, яка має тег robota. Вона містить літерний масив priz довжиною 15 символів (Петренко П.П.), масив rob[2] цілого типу (наприклад, число відпрацьованих годин за зміну та кількість виготовлених деталей: 7 і 64), змінну zarp типу float (45.5 – денна зарплата в грн), безіменне бітове поле довжиною 6 біт, а також іменоване поле b довжиною 2 біти, в яке записано вісімкове число 03 (двійкове 11).

У програмі structura використано найпростіший спосіб звернення до елементів структури – їх вивід, вона видасть такий результат:

Пріз=Петренко П.П. Год=7 Кіл= 64 Зар=45.500000 b=3

За допомогою тега robota можна створити іншу структуру того ж типу, наприклад, структуру slusar: struct robota slusar; Структура може й не мати тега, тоді в оголошенні вказується лише її ім’я.

Подібно до даних інших типів структура може мати адресу, тоді до неї можна звертатися за допомогою вказівника. Це звернення демонструє програма adresa_stru.

#include<stdio.h> /* adresa_stru */

int main(void)

{

struct {char s[12];

int k;

}ss={"Sakura S.S.", 456};

struct ss *curr = &ss;

puts(" ");

printf("curr=%p s=%s k=%d\n", curr, curr->s, curr->k);

}

Результати виконання програми adresa_stru:

curr=FFCC s=Sakura S.S. k=456

Програма adresa_stru починається з оголошення та ініціалізації структури ss, яка має два елементи: літерний масив s[12] і змінну k цілого типу. Далі оголошений вказівник curr типу структури ss, ініціалізований адресою структури ss.

Звернення до елементів структури виконується всередині функції printf() за допомогою імені вказівника та імені елемента, розділених знаками -> (мінус-більше).

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

#include<stdio.h> /* mas_stru */

struct kadry{char s[12];

int k;

struct kadry *dali;};

int main(void)

{

int i;

struct kadry *curr;

struct kadry dano[3]={{"Зелена З.З", 123, NULL},

{"Сакура С.С.", 456, NULL},

{"Калита К.К.", 789, NULL}

};

puts(" ");

curr=dano;

for(i=0; i<3; i++){curr->dali=curr+1;

printf("i=%d адр.=%p s=%s k=%d далі =%p\n",

i, curr, curr->s, curr->k, curr->dali);

curr++;

}

getch();

return 0;

}

Результати виконання програми mas_stru:

i=0 адр.=FFA8 s=Зелена З.З. k=123 далі =FFB8

i=1 адр.=FFB8 s=Сакура С.С. k=456 далі =FFC8

i=2 адр.=FFC8 s=Калита К.К. k=789 далі =FFD8

Програма mas_stru починається з оголошення тега (типу) kadry структури. Він містить три такі елементи: масив s довжиною 12 байт літерного типу, ціле число k типу int і вказівник *dali (від слова далі, наступний) на структуру типу struct kadry, тобто на таку ж структуру, яка оголошена тегом. Нагадаємо, що тип вказівника означає крок, з яким розташовуються в пам’яті елементи, на які він вказує. Сумарна довжина елементів тега дорівнює 16 байтам (1*12+2+2=16). Це число спеціально підібрано кратним 16 (шістнадцяткове 10) для вигідного перегляду адрес пам’яті, які виводяться в 16-й системі числення. Зауважимо, що під час виконання програми mas_stru застосовувався компілятор з довжинами типів: char – 1 байт, int – 2 байти та комп’ютер з 2-байтовою адресацією пам’яті.

Програмний блок містить такі оголошення: змінну i типу int – допоміжна змінна (параметр циклу), вказівник *curr (від слова current – поточний) типу struct kadry та масив структур dano[3] теж типу struct kadry. Масив dano ініціалізований під час оголошення трьома структурами, де s[12] – прізвище, k – ціле число, і вказівник *dali – адреса NULL. Цей нуль – формальний, він ніде не використовується в програмі, за його допомогою показано лише, що в тому місці має бути якась адреса.

Вказівник *curr містить поточну адресу структури, тобто адресу тієї структури, що в даний момент виводиться. Вказівник *dali замість формального числа NULL – наступну адресу (curr->dali=curr+1;), тобто адресу наступної структури за поточною. У програмі відбувається звернення до елементів структури – їх вивід на екран за допомогою функції printf().

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

puts(" ");

for(i=0; i<3; i++){(dano+i)->dali=dano+i+1;

printf("i=%d адр.=%p s=%s k=%d далі =%p\n",

i,dano+i, (dano+i)->s, (dano+i)->k, (dano+i)->dali);

}

Зауважимо, що ім’я масиву відрізняється від вказівника на масив тим, що його не можна нарощувати за допомогою операції декременту. Натомість, для пересування по пам’яті його дозволено нарощувати на потрібну кількість кроків. У вищенаведеному фрагменті це ім’я нарощується на величину i. Вираз (dano+i) взятий у круглі дужки тому, що приорітет операції -> вищий за приорітет операції додавання. Якби цих дужок не було, то компілятор сприйняв би змінну i за ім’я масиву.

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

union тег{оголошення складників об’єднання}ім’я об’єднання;

Перерахунковий тип даних призначений для створення послідовності чисел. Його оголошення має такий вигляд:

enum{список перерахунку};

Пояснимо дію цього типу на такому прикладі:

enum

{

a,

b,

d,

u,

v=5,

z

};

В ньому оголошено перерахунковий тип, змінні якого приймають такі значення:

a=0,

b=1,

d=2,

u=3,

v=5,

z=6.

Значення змінної a тут дорівнює нулю, тому що нумерація завжди починається з нуля, якщо не вказано інше число. Наступні змінні: b=1, d=2 і т.д., бо значення кожної з них нарощується на 1. Можна змінити цей порядок, тобто продовжити нарощення, починаючи з іншого числа, тому, якщо v=5, то z=6, яке теж нароститься на 1.

Перерахунковий тип вигідно застосовувати в тих випадках, коли потрібно встановити відповідність між словами і числами. Тоді у програмі можна застосувати, як числові константи, або ці слова, або відповідні їм числа. Вживання перерахункового типу підвищує “читабельність” програми. Читаючи її, ми бачимо не сухі числа, а наповнені фізичним змістом слова. Покажемо це на прикладі, нехай маємо оголошення днів тижня:

enum{pn=1, wt, sr, ch, pt, sb, nd};

Тоді оператори програми: int i; for(i=pn; i<=nd; i++)printf(" %d", i); видадуть таку послідовність: 1 2 3 4 5 6 7.

Тип типу дозволяє програмісту створювати будь-який тип даних на основі існуючих типів за допомогою такого оголошення:

typedef відомий тип новий тип;

Створимо, наприклад, тип cile на основі типу int. Тоді його можна використовувати для оголошення змінної цілого типу: cile i=123;

Абстрактні типи даних існують лише для позначення якогось типу, не виділяючи ніякої пам’яті для нього. Одним із випадків його застосування є параметр операції sizeof. Наприклад, функція printf("%d",sizeof(int)); видасть об’єм пам’яті в байтах, який дана версія мови С відводить для типу int.

До абстрактних типів даних належить також вищерозглянений тег robota, використаний для створення структури slusar. Теги вигідні для побудови багатьох однотипних структур великих розмірів.

Запитання для самоперевiрки

  1. Дайте визначенню масиву.

  2. Масиви якої розмірності дозволяє обробляти мова Сi? Чи можна в програмах мовою С використовувати багатовимiрнi масиви?

  3. Як оголошуються масиви? Наведiть можливi приклади.

  4. Що таке iнiцiалiзацiя масиву і як вона виконується?

  5. Яка роль символа '\0' – машинний нуль у масивах літерного типу?

  6. Скільки та в яких місцях матимемо машинних нулів після оголошення та ініціалізації багатовимірного літерного масиву?

  7. Як вiдбувається звертання до елемента масиву в програмах?

  8. Як розташовуються в пам’яті елементи багатовимірного масиву?

  9. Що таке вказівник та як він оголошується в програмі?

  10. Як можна ініціалізувати змінну або масив за допомогою вказівника?

  11. Як можна звертатися до елемента масиву за допомогою вказівника на цей масив?

  12. Поясніть поняття: структура, об’єднання, дані перерахункового типу, абстрактні типи даних, тег.

  13. Чим відрізняється об’єднання від структури за призначенням? Який об’єм пам’яті займає структура? об’єднання?

  14. Які значення можуть приймати змінні перерахункового типу і як відбувається їх ініціалізація? Який тип цих змінних?

  15. Що таке бітове поле структури і для чого воно використовується?

  16. Чи може бітове поле структури містити дійсне або від’ємне число?

  17. Перечисліть способи звертання до елементів структури.

  18. Як можна оголосити та використати масив структур?

  19. Як можна оголосити структуру за допомогою тега?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]