| ОПИСАНИЯ |
| Описания используются для определения переменных и для объявления типов переменных и функций, определенных в другом месте. Описания также используются для определения новых типов данных на основе существующих типов. Описание не является оператором. |
| Основные типы |
| Примеры
char с,
int х; Основными типами являются: char - символ (один байт) ; int - целое (обычно одно слово); unsigned - неотрицательное целое (такого же размера, как целое); short - короткое целое (слово или полуслово); long - длинное целое (слово или двойное слово); float - число с плавающей точкой (ординарной точности); double - число с плавающей точкой (двойной точности); void - отсутствие значения (используется для нейтрализации значения, возвращаемого функцией). Символы (char) в зависимости от компилятора могут быть со знаком или без знака. Рассматриваемые как целые, символы со знаком имеют значения от -127 до 128, а символы без знака - от 0 до 256. Некоторые реализации допускают явный тип unsigned char. Данные целого типа int могут иметь такой же диапазон, как данные типа long иди short. Описание типа unsigned эквивалентно описанию типа unsigned int. Описание unsigned может сочетаться с описанием типа char, short или long, формируя описания типов unsigned char, unsigned short, unsigned long. Описания типов short и long эквивалентны описаниям типов short int и long mt. Диапазон данных типа long обычно в два раза больше диапазона данных типа short |
| Замечание. Допустимо бесконечно большое
число различных типов указателей и массивов.
Далее следуют типовые примеры. Указатель на основной тип Пример char *p,Переменная р является указателем на символ, т. е. этой переменной должен присваиваться адрес символа. Указатель на указатель Пример char **t, Переменная t - указатель на указатель символа. Одномерный массив Пример int a [50]; Переменная а - массив из 50 целых чисел. Двухмерный массив Пример char m[7][50]; Переменная m - массив из семи массивов, каждый из которых состоит из 50 символов. Массив из семи указателей Пример char *G[7]; Массив G состоит из указателей на символы. Указатель на функцию Пример int (*f)(); f - указатель на функцию, возвращающую целое значение. |
| Структуры |
| Структура'
объединяет логически связанные данные разных
типов. Структурный тип данных определяется
следующим описанием: struct имя _структуры { описания_элементов Пример struct dinner { char * place, float cost, struct dinner *next, }; Структурная переменная описывается с помощью структурного типа. Примеры struct dinner week_days [7], /* массив структур */ struct dinner best_one, /* одна структурная переменная */ struct dinner *p; /* указатель на структурную переменную */ |
| Поля бит в структурах |
| Поле бит - это элемент структуры,
определенный как некоторое число бит, обычно
меньшее, чем число бит в целом числе. Поля бит
предназначены для экономного размещения в
памяти данных небольшого диапазона. Пр имер struct bfeg { unsigned int of_fldl 10; unsigned int bf_fld2 : Данная структура описывает 10-битовое поле, которое для вычислений преобразуется в значение типа unsigned int, и 6-битовое поле, которое обрабатывается как значение типа unsigned int. |
| Объединения |
| Объединение' описывает
переменную, которая может иметь любой тип из
некоторого множества типов.
Определение объединенного типа данных аналогично определению структурного типа данных union имя объединения { описания_элементов },Пример union bigword {long bg_long, char *bg_char[4]} Данные типа union bigword занимают память, необходимую для размещения наибольшего из своих элементов, и выравниваются в памяти к границе, удовлетворяющей ограничениям по адресации как для типа long, так и для типа char * [4] Описание переменной объединенного типа Пример union bigword x, union bigword *p, union bigword a[l00], 7.6. Перечисления Данные перечислимого типа относятся к некоторому ограниченному множеству данных Определение перечислимого типа данныхenum имя _перечислимого типа { список значении} Каждое значение данного перечислимого типа задается идентификаторомПример enum color { red green yellow } Описание переменной перечислимого типа Пример enum color chair, enum color suite [40]; Использование переменной перечислимого типа в выражении Пример char = red, suite [5] '= yellow 7.7. Переименование типов Формат typedef старый _тип новый_тип Примеры typedef long large /* определяется тип large эквивалентный типу long */ typedef char *stnng /* определяется тип string эквивалентный типу char * */ Переименование типов используется для введения осмысленных или сокращенных имен типов, что повышает понятность программ, и для улучшения переносимости программ (имена одного типа данных могут различаться на разных ЭВМ) |
| Определение локальных переменных |
| Замечание 1 Постоянные переменные,
сохраняемые в некоторой области памяти,
инициализируются нулем, если явно не заданы
начальные значения Временные переменные,
значения которых сохраняются в стеке или
регистре, не получают начального значения, если
оно не описано явно.
Замечание 2 Все описания в блоке должны предшествовать первому оператору Автоматические переменные Пример mt x, /* х - это автоматическая переменная */ } Автоматическая переменная является временной, так как ее значение теряется при выходе из блока. Областью определения является блок, в котором эта переменная определена. Переменные, определенные в блоке, имеют приоритет перед переменными, определенными в охватывающих блоках. Регистровые переменные Пример { register mt у; }" Регистровые переменные являются временными, их значения сохраняются в регистрах, если последние доступны. Доступ к регистровым переменным более быстрый. В регистрах можно сохранять любые переменные, если размер занимаемой ими памяти не превышает разрядности регистра. Если компилятор не может сохранить переменные в регистрах, он трактует их как автоматические. Областью действия является блок. Операция получения адреса & не применима к регистровым переменным. Формальные параметры Примеры mt func(x), int func(x) int x; register int x; Формальные параметры являются временными, так как получают значения фактических параметров, передаваемых функции. Областью действия является блок функции. Формальные параметры должны отличаться по именам от внешних переменных и локальных переменных, определенных внутри функции. В блоке функции формальным параметрам могут быть присвоены некоторые значения. Статические переменные Пример { static int flag }Статические переменные являются постоянными, так как их значения не теряются при выходе из функции. Любые переменные в блоке, кроме формальных параметров функции, могут быть определены как статические. Областью действия является блок. |
Глобальные переменные Пример int Global_flag; Определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Постоянные. Инициализируются нулем, если явно не задано другое начальное значение. Областью действия является вся программа. Должны быть описаны во всех файлах программы, в которых к ним есть обращения. 3 амечание. Некоторые компиляторы требуют, чтобы глобальные переменные UHggonpenei^ лены только в одном файле и описаны как внешние вдругахфай-лах, где они используются (см. с. 51). Должны быть описаны в файле до первого использования. Статические переменные Пример static mt File _ flag; Постоянные. Областью действия является файл, в котором данная переменная определена. Должны быть описаны до первого использования в файле. |
Любая переменная, кроме формальных параметров или автоматических массива, структуры или объединения, при определении может быть инициализирована. Любая постоянная переменная инициализируется нулем (0) ', если явно не задано другое начальное значение. В качестве начального значения может использоваться любое константное выражение. Основные типыПримеры mt 1 = 1, float x= 3.145e - 2, Массивы Примеры mta[] = {1,4,9,16,25,36}, chars [20] = {'a'.'b'.'c' }, Список значений элементов массива должен быть заключен в фигурные скобки. Если задан размер массива, то значения, не заданные явно, равны 0. Если размер массива опущен, то он определяется по числу начальных значений. Строки Пример char s[] = "hello". Это описание эквивалентно описанию chars[] = {'h'.'e','l',T,'o'.'\0'}, Структуры Пример struct person { int height, char gender, }; struct person x = {70, Y \ , struct person family [ ] = { {73.'X'}. {68.'Y'}, {50.'X'} Это значит, что если переменная целая, то ее начальное значение равно 0, если символьная, то '\0', если это число с плавающей точкой, то 0.0. Список значений для каждой струмурнои переменной должен быть заключен в фигурные скобки, хогя, если число значений соответствует числу структуры, это не обя эательно Значения присваиваются элементам структуры в порядке размещения элементов в определении структурного типа. Список значений может быть неполным, в этом случае неинициализированные элементы получают в качестве значения 0. Пример struct person people [l0] = { {68}, {71}, {74}, Элементам height первых трех структурных переменных массива присваиваются явные значения; остальные переменные получают значение 0. |
Тип внешних объектов (т. е. переменных или функций), определенных в другой компоненте программы, должен быть явно описан. Отсутствие такого описания может привести к ошибкам при компиляции, компоновке или выполнении программы. При описании внешнего объекта используйте ключевое слово extern. Примеры extern int Global_var; extern char *Name; extern int func(); Можно опускать длину внешнего одномерного массива. Пример extern float Num_array [ ]; Поскольку все функции определены на внешнем уровне, то для описания функции внутри блока прилагательное extern избыточно и часто опускается. |