10.3: Структури, масиви тощо
- Page ID
- 29636
Ми бачили, що можна мати масиви всередині структур. Також можна мати структури всередині структур та покажчики всередині структур. Ось кілька прикладів:
/* The structure definitions */
struct foo {
float x;
float y;
};
struct bar {
double *pd;
struct foo littlefoo;
struct foo *pf;
};
/* The variable declarations */
struct foo my_foo;
struct bar my_bar;
struct bar *pbar = &my_bar;
double z=1.0;
Структура бару містить покажчик на подвійний, покажчик на структуру foo та структуру foo. Ми б отримали доступ до них наступним чином:
my_bar.pd = &z; /* pd isn’t a double but the address of one, hence & */ my_bar.littlefoo.x = 2.2; pbar->littlefoo.y = 3.3; pbar->pf = &my_foo; pbar->pf->x = 4.4;
Зауважте, що якщо ви спочатку не сказали pbar->pf = &my_foo;, то pbar->pf->x = 4.4; було б дуже зло! Без присвоєння my_foo pf цей покажчик буде містити якесь випадкове число. Друга заява буде використовувати це число як початкову адресу структури foo, і написати число 4.4, де має бути поле x. Оскільки вкрай малоймовірно, що це випадкове число є початковою адресою структури foo, число 4.4 перезаписує щось інше. Це може означати, що інші дані або навіть код буде знищений. Ваша програма веде себе хаотично або аварійно завершує роботу.
Ніколи не разименованія 1 неініціалізованого покажчика!
Будуть тільки погані, злі речі і ви станете дуже сумним програмістом.
На початку транзисторного прикладу ми зазначили, що ми могли б захотіти створити купу транзисторів. Однією з можливостей є використання масиву. Є й інші способи, як ми побачимо. Ось як ви оголосили масив 1000 транзисторних структур, враховуючи визначення вище:
struct transistor transistors[1000];
Ви б отримати доступ до поля наступним чином:
transistors[0].currentgain = 200.0; /* set 1st device’s gain to 200 */ transistors[2].breakdown = 85.0; /* set 3rd device’s breakdown to 85 */
Нарешті, також можна створити масив покажчиків на транзисторні структури:
struct transistor *ptarray[1000];
Зауважимо, що у нас немає 1000 транзисторних структур, а скоріше 1000 покажчиків. Кожен з них повинен вказати на відповідну транзисторну структуру. Припускаючи, що ви оголосили один з іменем my_transistor, як ми робили раніше, ви можете написати:
ptarray[0] = &my_transistor;
І ви можете отримати доступ до полів, як так:
ptarray[0]->maxpower = 25.0;
Хоча це може виглядати трохи дивно спочатку, такого роду конструкція має деякі хороші використання в більш просунутих додатках. Щоб розтягнути свій розум лише трохи далі, C дозволяє створити щось на зразок масиву покажчиків на структури, які містять структуру, яка, в свою чергу, містить масив покажчиків на інші структури. Прочитайте це ще раз, уявіть, як це може виглядати як карта пам'яті, а потім напишіть деякі можливі визначення/декларації. Якщо ви можете це зробити, ви досить добре освоїли цю ідею.
- тобто, спробуйте отримати доступ до полів.
