Конструктор массива – это квадратные скобки []. Язык поддерживает многомерные массивы. Размерность по каждому указывается в скобках. На самом деле любой многомерный массив представляется в памяти компьютера в виде одномерного вектора, состоящего из под-веторов. Поскольку в качестве индекса этого суммарного вектора используется переменная целого типа, то число элементов в массиве ограничено.
Поскольку С не поддерживает строковый тип данных, единственный способ объявить строку – это создать массив переменных символьного типа. Что бы отличить строки от массивов символов принято в конце каждой строки (то есть в последний элемент массива символов, представлящего строку) записывать 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 байта пойдут на выравнивание. Если бы мы использовали эту структуру для записи в файл, то получили бы два пустых байта в каждой записи в файле на диске.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.