|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Битовые поляОб"явления битовых полей имеют следующий синтаксис: <type-specifier>[<identifier>]:<constant-expression>; Битовое поле состоит из некоторого числа бит, специфициро- ванных константным выражением- <constant- expression>. Для бито- вого поля спецификатор типа <type- specifier> должен специфициро- вать беззнаковый целый тип, а константное выражение должно быть неотрицательной целой величиной. Массивы битовых полей, указатели на битовые поля и функции, возвращающие битовые поля не допускаются. Идентификатор- <identifier> именует битовое поле. Неименованное битовое поле, чей размер специфицируется как нулевой, имеет специальное назначение: оно гарантирует, что память для следующей переменной об"явления будет начинаться на границе int. Идентификаторы элементов внутри об"являемой структуры должны быть уникальными. Идентификаторы элементов внутри разных структур могут совпадать. В пределах той же самой видимости теги структур должны отличаться от других тегов (тегов других структур, совмещений и перечислений). Переменные (элементы) структуры запоминаются последовательно в том же самом порядке, в котором они об"являются: первой переменной соответствует самый младший адрес памяти, а последнейсамый старший. Память каждой переменной начинается на границе свойственной ее типу. Поэтому могут появляться неименованные участки между соседними элементами. Битовые поля не располагаются на пересечении границ, обявленных для них типов. Например, битовое поле, об"явленое с типом unsigned int, упаковывается или в пространстве, оставшимся от предидущего unsigned int или начиная с нового unsigned int. Примеры /**************** Example 1 ****************/ struct { float x,y; } complex; /**************** Example 2 *****************/ struct employee { char name[20]; int id; long class; } temp; /**************** Example 3 ******************/ struct employee student, faculty, staff; /**************** Example 4 ******************/ struct sample { char c; float *pf; struct sample *next; } x; /***************** Example 5 ******************/ struct { unsigned icon: 8; unsigned color: 4; unsigned underline: 1; unsigned blink: 1; } screen[25][80]; В первом примере об"является переменная с именем complex типа структура. Эта структура состоит из двух элементов x и y типа float. Тип структуры не поименован. Во втором примере об"является переменная с именем temp типа структура. Структура состоит из трех элементов с именами name, id и class. Элемент с именем name- это массив иэ 20- ти элементов типа char. элементы с именами id и class- это простые переменные типа int и long соответственно. Идентификатор employee является тегом структуры. В третьем примере об"явлены три переменных типа структура с именами: student, faculty и staff. Каждая из структур состоит из трех элементов одной и той же конструкции. Элементы определены при об"явлении типа структуры с тегом employee в предыдущем примере. В четвертом примере об"является переменная с именем x типа структура. Первые два элемента структуры представлены переменной c типа char и указателем pf на величину типа float. Третий элемент с именем next об"являются как указатель на описываемую структуру sample. В пятом примере об"является двумерный массив поименованный screen, элементы которого имеют структурный тип. Массив состоит из 2000 элементов и каждый элементэто отдельная структура, состоящая из четырех элементов типа bit-fild с именами icon, color, underline и blink. Об"явление совмещений Синтаксис: union[<tag>]{<member-declaration-list>}<declarator>[,<declarator>...]; union<tag><declarator>[,<declarator>...]; Об"явление совмещения определяет имя переменной совмещения и специфицирует множество переменных, называемых элементами совмещения, которые могут быть различных типов. Переменная с типом совмещения запоминает любую отдельную величину, определяемую набором элементов совмещения. Об"явление совмещения имеет тот же самый синтаксис, как и об"явление структуры, за исключением того, что она начинается с ключевого слова union вместо ключевого слова struct. Для об"явления совмещения и структуры действуют одни и те же правила, за исключением того, что в совмещении не допускаются элементы типа битовых полей. Память, которая соответствует переменной типа совмещение, определяется величиной для размещения любого отдельного элемента совмещения. Когда используется наименьший элемент совмещения, то переменная типа совмещения может содержать неиспользованное пространство. Все элементы совмещения запоминаются в одном и том же пространстве памяти переменной, начиная с одного и того же адреса. Запомненные значения затираются каждый раз, когда присваивается значение очередного элемента совмещения. Примеры: /************** Example 1 ********************/ union sign { int svar; unsigned uvar; } number; /************** Example 2 ********************/ union { char *a, b; float f[20]; } jack; /*************** Example 2 *******************/ union { struct { char icon; unsigned color: 4; } window1, window2, window3, window4; } screen[25][80]; В первом примере об"является переменная типа совмещения, поименованная number. Список элементов совмещения состоит из двух об"явлений переменных: svar типа int и uvar типа unsigned. Это об"явление позволяет запоминать текущее значение number в знаковом или беззнаковом виде. Тип совмещения поименован идентификатором sign. Во втором примере об"является переменная типа совмещения с именем jack. Список элементов об"явления состоит из трех об"явлений: указателя a на величину типа char, переменной b типа char и массива f из 20 элементов типа float. Тип совмещения не поименован. Память, распределенная для переменной jack, равна памяти, распределенной под массив f, поскольку f самый большой элемент совмещения. В третьем примере об"является двумерный массив совмещений с именем screen. Массив состоит из 2000 об"ектов. Каждый об"ектэто отдельное совмещение из четырех элементов: window1, window2, window3, window4, где каждый элемент- это структура. В любое заданное время каждый об"ект совмещения поддерживается одним из четырех возможных элементов типа структура. Таким образом, переменная screen- это композиция четырех возможных "windows". Об"явление массива Синтаксис: <type-specifier><declarator>[<constant-expression>]; <type-specifier><declarator>[]; Здесь квадратные скобки- это терминальные символы. Об"явление массива определяет тип массива и тип каждого элемента. Оно может определять также число элементов в массиве. Переменная типа массив рассматривается как указатель на элементы массива. Об"явление массива может представляться в двух синтаксических формах, указанных выше. Декларатор<declarator> задает имя переменной. Квадратные скобки, следующие за декларатором, модифицируют декларатор на тип массива. Константное выражение <constant-expression>, заключенное в квадратные скобки, определяет число элементов в массиве. Каждый элемент имеет тип, задаваемый спецификатором типа <type-specifier>, который может специфицировать любой тип, исключая void и тип функции. Во второй синтаксической форме опущено константное выражение в квадратных скобках. Эта форма может быть использована только тогда, когда массив инициализируется или об"явлен как формальный параметр или об"явлен как ссылка на массив, явно определенный где-то в программе. Массив массивов или многомерный массив определяется путем задания списка константных выражений в квадратных скобках, следущего за декларатором: <type-specifier><declarator>[<constant-expression>] [<constant-expression>]... Каждое константное выражение- <constant-expression> в квадратных скобках определяет число элементов в даннном иэмерении массива, так что об"явление двумерного массива содержит два константных выражения, трехмерного- три и т.д. Если многомерный массив об"является внутри функции или если он инициализируется либо об"является как формальный параметр или об"является как ссылка на массив, явно определенный где- то в программе, то первое константное выражение может быть опущено. Массив указателей на величины,заданного типа, может быть определен посредством составного декларатора, как было описано в разделе 4.3.2. Типу массив соответствует память, которая требуется для размещения всех его элементов. Элементы массива с первого до последнего запоминаются в последовательных возрастающих адресах памяти. Между элементами массива в памяти разрывы отсутствуют. Элементы массива запоминаются друг за другом построчно. Например, массив, содержащий две строки с тремя столбцами каждая, char A[2][3] будет запомнен следующим образом. Сначала запоминаются три столбца первой строки, затем элементы трех столбцов второй строки. Смысл этого в том, чтобы последний индекс был более быстрым. Чтобы сослаться на отдельный элемент массива, нужно использовать индексное выражение, которое описано в разделе 5.2.5. Примеры: /*************** Example 1 ******************/ int scores[10], game; /*************** Example 2 ******************/ float matrix[10][15]; /*************** Example 3 ******************/ struct { float x,y; } complex[100]; /*************** Example 4 *******************/ char *name[20]; В первом примере об"является переменная типа массив с именем scores из 10 элементов типа int. Переменная с именем game об"явлена как простая переменная целого типа. Во втором примере об"является двумерный массив с именем matrix. Массив состоит из 150-ти элементов типа float. В третьем примере об"является массив структур. Массив состоит из 100 об"ектов. Каждый об"ект массива представляет собой структуру, состоящую из двух элементов. В четвертом примере об"явлен массив указателей. Массив состоит из 20-ти элементов, каждый из которых является указателем на величину типа char. 4.4.6. Об"явление указателей Синтаксис: <type-specifier> *<declarator>; Об"явление указателя определяет имя переменной типа указатель и тип об"екта, на который указывает эта переменная. Декларатор- <declarator> определяет имя переменной с возможной модификацией ее типа. Спецификатор типа- <type- specifier> задает тип об"екта, который может быть базового типа, типа структуры или совмещения. Переменная типа указатель может указывать также на функции, массивы и другие указатели. Более полная информация о типах указателей дана в разделе 4.3.2. "Составные деклараторы". Если указатель не используется до определения типа структуры или совмещения, то он может быть об"явлен ранее этого определения. Такие об"явления допускаются, поскольку компилятору не требуется знать размера структуры или совмещения, чтобы распределить память под переменную типа указатель. Указатель может быть об"явлен посредством использования тега структуры или совмещения (смотри ниже пример 4). Переменная, об"явленная как указатель, хранит адрес памяти. Размер памяти, требуемый для адреса, и смысл адреса зависит от данной конфигурации машины. Указатели на различные типы не обязательно имеют одну и ту же длину. Для некоторых реализаций используются специальные ключевые слова near, far и huge, чтобы модифицировать размер указателя. Об"явления, использующие специальные ключевые слова, были описаны в разделе 4.3.3. Информация о смысле ключевых слов дана в системной документации. Примеры: char *message; /* Example 1 */ int *pointers[10]; /* Example 2 */ int (*pointer)[10]; /* Example 3 */ struct list *next, *previous; /* Example 4 */ struct list { /* Example 5 */ char *token; int count; struct list *next; } line; struct id { /* Example 6 */ unsigned int id_no; struct name *pname; } record; В первом примере об"является переменная- указатель поименованная message. Она указывает на величину типа char. Во втором примере об"явлен массив указателей, поименованный pointers. Массив состоит из 10 элементов. Каждый элемент- это указатель на переменную типа int. В третьем примере об"явлена переменная- указатель, поименованная pointer. Она указывает на массив из 10 элементов. Каждый элемент в этом массиве имеет тип int. В четвертом примере об"явлены две переменныхуказателя, которые ссылаются на величины структурного типа list (смотри следующий пример). Определение типа с именем list должно находиться в пределах видимости об"явления. В пятом примере об"является переменная с именем line, структурного типа, поименованного list. Тип структуры с именем list определяется тремя элементами. Первый элементэто указатель на величину типа char, второй- на величину типа int, а третийэто указатель на следующую структуру типа list. В шестом примере об"является переменная с именем record, имеющая тип структуры с именем id. Заметим, что третий элемент с именем pname об"явлен как указатель на другой тип структуры с именем name. Это об"явление может появиться перед об"явление структуры с именем name. Об"явление функций Синтаксис: [<type-specifier>]<declarator>([<arg-type-list>])[,<declarator>...]; Об"явление функции определяет имя, тип возврата функции и, возможно, типы и число ее аргументов. Об"явление функции также называется forward- об"явлением. Декларатор функции об"являет имя функции, а спецификатор типа задает тип возврата. Если спецификатор типа опущен в об"явлении функции, то предполагается, что функция возвращает величину типа int. Об"явление функции может включать спецификаторы класса памяти extern или static. Список типов аргументов. Список типов аргументов- <arg-type-list> определяет число и типы аргументов функции. Синтаксис списка аргументов следующий: <type-name-list>[,...] Список имен типов- это список из одного или более имен типов. Каждое имя типа отделяется от другого запятой. Первое имя типа задает тип первого аргумента, второе имя типа задает тип второго аргумента и т. д. Если список имен типов заканчивается запятой с многоточием (,...), то это означает, что число аргументов функции переменно. Однако, предполагается, что функция будет иметь не меньше аргументов, чем имен типов, предшествующих многоточию. Если список типов аргументов- <arg-type-list> содержит только многоточие (...), то число аргументов функции является пе- ременным или равно нулю. Замечание: Чтобы поддержать совместимость с программами предидущих версий, компилятор допускает символ запятой без многоточия в конце списка типов аргументов для обозначения их переменного числа. Запятая может быть использована и вместо многоточия для об"явления нуля или более аргументов функции. Использование запятой поддерживается только для совместимости. Использование многоточия рекомендуется для нового представления. Имя типа- <type- name> для типов структуры, совмещения или базового типа состоит из спецификатора этого типа (такого как int). Имена типов для указателей, массивов и функций формируются путем комбинации спецификатора типа с "абстрактным декларатором". Абстрактный декларатор- это декларатор без идентификатора. В разделе 4.9 "Имена типов" об"ясняется, каким об"разом формировать и интерпретировать абстрактные деклараторы. Для того чтобы об"явить функцию, не имеющую аргументов, может быть использовано специальное ключевое слово void на месте списка типов аргументов. Компилятор вырабатывает предупреждающее сообщение, если в вызове такой функции будут специфицированы аргументы. Еще одна специальная конструкция допускается в списке типов аргументов. Это фраза void *, которая специфицирует аргумент типа указатель. Эта фраза может быть использована в списке типов аргументов вместо имени типа. Список типов аргументов может быть опущен. В зтом случае скобки после идентификатора функции все же требуются, хотя они и пусты. В этом случае в об"явлении функции не определяются ни типы, ни число аргументов в функции. Когда эта информация опускает- ся, то компилятор не проверяет соответствия между формальными и фактическими параметрами при вызове функции. Более подробная информация дана в разделе 7.4 "Вызовы функций". Тип возврата Функции могут возвращать величины любого типа за исключением массивов и функций. Для этого посредством спецификатора типа"type-specifier" в об"явлении функции можно специфицировать любой тип: основной, структуру или совмещение. Идентификатор функции может быть модифицирован одной или несколькими звездочками (*), чтобы об"явить возвращаемую величину типа указателя. Хотя функции и не допускают возвратов массивов или функций, но они могут возвращать указатели на массивы или функции. Функции, которые возвращают указатели на величины типа массив или функция, об"являются посредством модификации идентификатора функции квадратными скобками, звездочкой и круглыми скобками, чтобы сформировать составной декларатор. Формирование и интерпретация составных деклараторов рассматривались в разделе 4.3.2. Примеры: int add(int, int); /* Example 1 */ double calc(); /* Example 2 */ char *strfind(char *,...); /* Example 3 */ void draf(void); /* Example 4 */ double (*sum(double, double)) [3]; /* Example 5 */ int (*select(void)) (int); /* Example 6 */ char *p; /* Example 7 */ short *q; int prt(void *); В первом примере об"является функция, поименованная add, которая требует два аргумента типа int и возвращает величину типа int. Во втором примере об"является функция, поименованная calc, которая возвращает величину типа double. Список типов аргументов не задан. В третьем примере об"является функция, поименованная strfind, которая возвращает указатель на величину типа char. Функция требует, по крайней мере один аргументуказатель на величину типа char. Список типов аргументов заканчивается запятой с многоточием, обозначающим, что функция может потребовать большее число аргументов. В четвертом примере об"является функция с типом возврата void (нет возвращаемой величины). Список типов аргументов также void, означающий отсутствие аргументов для этой функции. В пятом примере sum об"является как функция, возвращающая указатель на массив из трех величин типа double. Функция sum требует два аргумента, каждый из которых является величиной типа double. В шестом примере функция, поименованная select, об"явлена без аргументов и возвращает указатель на функцию. Указатель возврата ссылается на функцию, требующую один аргумент типа int и возвращающую величину типа int. В седьмом примере об"явлена функция prt, которая требует аргумент- указатель любого типа, и которая возвращает величину типа int. Любой указатель p или q могли бы быть использованы как аргументы функции без выдачи при этом предупреждающего сообщения.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.013 сек.) |