
- •Виды специализированных языков:
- •Особенности языка Си
- •Особенности других языков
- •Использование указателей при обращении к эелементам массивов
- •Int array[25]; // array эквивалентно &array[0]
- •Области действия и области видимости переменных, классы памяти, локальные, глобальные и статические переменные.
- •Операции языка Си
- •Операция преобразования типов
- •Операторы цикла
- •Особенности применения оператора for
- •Операторы условных и безусловных переходов
- •If (условие) оператор_1; else оператор_2;
- •Особенности применения
- •Int type; /* признак компонента */
- •Определение объектов и типов
- •Инициализация данных
- •Объявление функций
- •Аргументы функции main( )
Особенности применения
Переменная типа перечисления может принимать значения одной из именованных констант списка. Именованные константы списка имеют тип int.
Список-перечисления содержит одну или несколько конструкций вида:
идентификатор [= константное выражение]
Все идентификаторы в списке enum должны быть уникальными. В случае отсутствия константного выражения первому идентификатору соответствует значение 0, следующему идентификатору - значение 1 и т.д. Имя константы перечисления эквивалентно ее значению.
Следующему идентификатору в списке присваивается значение, на 1 большее предыдущего, если этот идентификатор не имеет своего константного выражения. Пример:
enum week { SUB = 0, /* 0 */
VOS = 3, /* 3 */
POND, /* 4 */
VTOR, /* 5 */
} rab_ned ;
enum week rab1;
Массивы – это группа элементов одинакового типа. Из объявления массива компилятор должен получить информацию о типе элементов массива и их количестве.
Объявление
int A[20]; float A[];
Особенности применения
Элементами массива не могут быть функции и элементы типа void.
Отметим, что в языке СИ первый элемент массива имеет индекс равный 0. Примеры:
int w[3][3] = { { 2, 3, 4 },
{ 3, 4, 8 },
{ 1, 0, 9 } };
В последнем примере объявлен массив w[3][3]. Списки, выделенные в фигурные скобки, соответствуют строкам массива.
int b[2][3][4];
При обращении к массиву b можно написать, например, b[1][2] и будет передаваться вектор из четырех элементов, а обращение b[1] даст двухмерный массив размером 3 на 4.
Пример объявления символьного массива. char str[] = "символьный массив";
Следует учитывать, что в символьном литерале находится на один элемент больше, так как последний из элементов является управляющей последовательностью '\0'.
Структуры
Cтруктуры – это составной объект, в который входят элементы любых типов, за исключением функций. В отличие от массива, который является однородным объектом, структура может быть неоднородной. В структуре обязательно должен быть указан хотя бы один компонент.
Объявление
struct Point {float x,y,z; int N;} P1,P2; struct Point P3,P4;
struct {float x,y,z; int N;} P1,P2,P3,P4;
Особенности применения
Ниже рассматривается использование рекурсивных тегов структуры.
struct node { int data; struct node * next; } st1;
Структуры не могут быть прямо рекурсивными, т.е. структура node не может содержать компоненту, являющуюся структурой node, но любая структура может иметь компоненту, являющуюся указателем на свой тип, как и сделано в приведенном примере.
Доступ к компонентам структуры осуществляется с помощью указания имени структуры и следующего через точку имени выделенного компонента, например: P1.x=10;
Объединения (union) подобны структуре, однако в каждый момент времени может использоваться только один из элементов объединения. Тип объединения может задаваться в следующем виде:
union { описание элемента 1; ... описание элемента n; };
Главной особенностью объединения является то, что для каждого из объявленных элементов выделяется одна и та же область памяти, т.е. они перекрываются.
Доступ к элементам объединения осуществляется тем же способом, что и к структурам
Память, которая соответствует переменной типа объединения, определяется величиной, необходимой для размещения наиболее длинного элемента объединения. Все элементы объединения хранятся в одной и той же области памяти, начиная с одного адреса. Пример:
union {int ax; char al[2];} ua;
Объединение ua позволяет получить отдельный доступ к младшему ua.al[0] и к старшему ua.al[1] байтам двухбайтного числа ua.ax .
Поля битов
Элементом структуры может быть битовое поле, обеспечивающее доступ к отдельным битам памяти. Вне структур битовые поля объявлять нельзя. Нельзя также организовывать массивы битовых полей и нельзя применять к полям операцию определения адреса.
Объявление
struct { unsigned A: 5; unsigned B: 3; }
Длина поля определяет число битов, отведенное соответствующему полю. Поле нулевой длинны обозначает выравнивание на границу следующего слова.
Структуры битовых полей могут содержать и знаковые компоненты. Такие компоненты автоматически размещаются на соответствующих границах слов, при этом некоторые биты слов могут оставаться неиспользованными.
Ссылки на поле битов выполняются точно так же, как и компоненты общих структур. Само же битовое поле рассматривается как целое число, максимальное значение которого определяется длиной поля.
Переменные с изменяемой структурой
Рассмотрим пример, в котором информация о геометрических фигурах представляется на основе комбинированного использования структуры и объединения.
struct figure {
double area,perimetr; /* общие компоненты */