Язык программирования C. Структура простейшей программы на языке C, страница 6

Конструктор массива – это квадратные скобки []. Язык поддерживает многомерные массивы. Размерность по каждому указывается в скобках.  На самом деле любой многомерный массив представляется в памяти компьютера в виде одномерного вектора, состоящего из под-веторов. Поскольку в качестве индекса этого суммарного вектора используется переменная целого типа, то число элементов в массиве ограничено.

Поскольку С не поддерживает строковый тип данных, единственный способ объявить строку – это создать массив переменных символьного типа. Что бы отличить строки от массивов символов принято в конце каждой строки (то есть в последний элемент массива символов, представлящего строку) записывать 0. Это чисто программистское ухищрение, которое позволяет оперировать псевдостроками.

Структуры создаются с помощью ключевого слова struct. 

Структура представляет собой агрегатный тип данных, объединяющий в себе набор переменных различного типа. Этот набор выступает в качестве единого целого. Доступ к элементу структуры осуществляется с помощью составного (уточняющего) имени. Рассмотрим на примере.

struct  /* Ключевое слово для определения структуры */

{

char acName[25];

char  cClass;

int     iSubClass;

float  fDecl;

float  fRA;

float  fDist;

} Star; /* Имя структуры */

Чтобы получить доступ к расстоянию до звезды необходимо уточнить, к какой именно структуре относится эта переменная:

Star.fDist  - здесь мы использовали оператор выбора переменной точка (.). Следует помнить, что поскольку новый тип данных, созданный с помощью конструктора типов struct, не является базисным типом, то он не обязан поддерживать набор операций, например, операцию присваивания. То есть, если определить два элемента данных типа структура Star, например, Gamma и Epsilon, то выражение

Gamma = Epsilon; будет некорректно. Следует использовать поэлементное присваивавание для каждого члена структуры:

strcpy ( Gamma.acName,Epsilon.acName);

Gamma.cClass               = Epsilon. cClass;

Gamma.iSubClass                    = Epsilon. iSubClass;

Gamma.fDecl                = Epsilon. fDecl;

Gamma.fRA                  = Epsilon. fRA;

Gamma.fDist                 = Epsilon. fDist;

При расчете количества байт, выделяемых для хранения структуры в ОП, необходимо учитывать выравнивание переменных определенного типа на границу слова. Если не использовать специальных ключей компилятора, то по умолчанию большинство компиляторов располагает переменные целого и вещественного типа с границы слова. Подсчитаем, сколько байт необходимо для хранения структуры типа Star в оперативной памяти на 16 разрядной платформе:

25 байт для переменной acName

1 байт для переменной  cClass;

2 байта для переменной iSubClass;

4 байта для переменной fDecl;

4 байта для переменной fRA;

4 байта для переменной fDist;

Итого 40 байт. А теперь переставим местами определение переменных cClass и iSubClass:

struct  /* Ключевое слово для определения структуры */

{

char acName[25];

int     iSubClass;

char  cClass;

float  fDecl;

float  fRA;

float  fDist;

} Star; /* Имя структуры */

Переменная iSubClass должна начинаться на границе слова. Предыдущий массив символов acName занимает 25 байт. Поскольку структура располагается начиная с четного байта, то acName заканчивается на нечетном. Следовательно, между acName и iSubClass компилятор поместит пустой байт для того, чтобы выравнять целую переменную на границу слова. Аналогично компилятор поступит и с переменной fDecl, которая слкдует за переменной cClass, занимающей только один байт. Следовательно, в этом случае для хранения структуры понадобится 42 байта – 40 для переменных и 2 байта пойдут на выравнивание. Если бы мы использовали эту структуру для записи в файл, то получили бы два пустых байта в каждой записи в файле на диске.