МЕНЮ


Фестивали и конкурсы
Семинары
Издания
О МОДНТ
Приглашения
Поздравляем

НАУЧНЫЕ РАБОТЫ


  • Инновационный менеджмент
  • Инвестиции
  • ИГП
  • Земельное право
  • Журналистика
  • Жилищное право
  • Радиоэлектроника
  • Психология
  • Программирование и комп-ры
  • Предпринимательство
  • Право
  • Политология
  • Полиграфия
  • Педагогика
  • Оккультизм и уфология
  • Начертательная геометрия
  • Бухучет управленчучет
  • Биология
  • Бизнес-план
  • Безопасность жизнедеятельности
  • Банковское дело
  • АХД экпред финансы предприятий
  • Аудит
  • Ветеринария
  • Валютные отношения
  • Бухгалтерский учет и аудит
  • Ботаника и сельское хозяйство
  • Биржевое дело
  • Банковское дело
  • Астрономия
  • Архитектура
  • Арбитражный процесс
  • Безопасность жизнедеятельности
  • Административное право
  • Авиация и космонавтика
  • Кулинария
  • Наука и техника
  • Криминология
  • Криминалистика
  • Косметология
  • Коммуникации и связь
  • Кибернетика
  • Исторические личности
  • Информатика
  • Инвестиции
  • по Зоология
  • Журналистика
  • Карта сайта
  • Лекции по C++

    элементов, каждый из которых является указателем на величину типа char.

    4.4.6. Об"явление указателей

    Синтаксис:

    *;

    Об"явление указателя определяет имя переменной типа указатель и тип

    об"екта, на который указывает эта переменная. Декларатор-

    определяет имя переменной с возможной модификацией ее типа. Спецификатор

    типа- задает тип об"екта, который может быть

    базового типа, типа структуры или совмещения.

    Переменная типа указатель может указывать также на функции, массивы и

    другие указатели. Более полная информация о типах указателей дана в

    разделе 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.

    Об"явление функций

    Синтаксис:

    []([])[,...];

    Об"явление функции определяет имя, тип возврата функции и, возможно,

    типы и число ее аргументов. Об"явление функции также называется

    forward- об"явлением. Декларатор функции об"являет имя функции, а

    спецификатор типа задает тип возврата. Если спецификатор типа опущен

    в об"явлении функции, то предполагается, что функция возвращает

    величину типа int.

    Об"явление функции может включать спецификаторы класса памяти extern

    или static.

    Список типов аргументов.

    Список типов аргументов- определяет число и типы

    аргументов функции. Синтаксис списка аргументов следующий:

    [,...]

    Список имен типов- это список из одного или более имен типов. Каждое

    имя типа отделяется от другого запятой. Первое имя типа задает тип

    первого аргумента, второе имя типа задает тип второго аргумента и т. д.

    Если список имен типов заканчивается запятой с многоточием (,...), то

    это означает, что число аргументов функции переменно. Однако,

    предполагается, что функция будет иметь не меньше аргументов, чем имен

    типов, предшествующих многоточию.

    Если список типов аргументов- содержит

    только многоточие (...), то число аргументов функции является пе-

    ременным или равно нулю.

    Замечание:

    Чтобы поддержать совместимость с программами предидущих версий,

    компилятор допускает символ запятой без многоточия в конце списка типов

    аргументов для обозначения их переменного числа. Запятая может быть

    использована и вместо многоточия для об"явления нуля или более

    аргументов функции. Использование запятой поддерживается только для

    совместимости. Использование многоточия рекомендуется для нового

    представления.

    Имя типа- для типов структуры, совмещения или базового

    типа состоит из спецификатора этого типа (такого как 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 могли бы быть использованы как аргументы функции без

    выдачи при этом предупреждающего сообщения.

    Классы памяти

    Класс памяти переменной, которая определяет какой либо об"ект,

    имеет глобальное или локальное время жизни. Об"ект с глобальным временем

    жизни существует и имеет значение на протяжении всей программы. Все функции

    имеют глобальное время жизни.

    Переменные с локальным временем жизни захватывают новую па-

    мять при каждом выполнении блока, в котором они определены. Когда

    управление на выполнение передается из блока, то переменная теря-

    ет свое значение.

    Хотя Си определяет два типа классов памяти, но, тем не менее, имеется

    следующих четыре спецификатора классов памяти:

    auto

    register

    static

    extern

    Об"екты классов auto и register имеют локальное время жизни.

    Спецификаторы static и extern определяют об"екты с глобальным временем

    жизни. Каждый из спецификаторов класса памяти имеет определенный смысл,

    который влияет на видимость функций и переменных в той же мере, как и

    сами классы памяти. Термин "видимость" относится к той части программы, в

    которой могут ссылаться друг на друга функции и переменные. Об"екты с

    глобальным временем жизни существуют на протяжении выполнения исходной

    программы, но они могут быть видимы не во всех частях программы.

    Видимость и связанная с ней концепция времени жизни рассмотрена в разделе

    3.5.

    Месторасположение об"явления переменной или функции внутри

    исходных файлов также влияют на класс памяти и видимость. Говорят, что

    об"явления вне определения всех функций и переменных относятся к внешнему

    уровню, а об"явления внутри определений функций относятся к внутреннему

    уровню.

    Точный смысл каждого спецификатора класса памяти зависит от того,

    находится ли об"явление на внешнем или внутреннем уровне и от того,

    об"явлен ли об"ект функцией или переменной. В следующем разделе

    описывается смысл спецификаторов класса памяти в каждом случае об"явления,

    а также об"ясняется режим умолчания, когда спецификатор класса памяти

    опущен при об"явлении переменной или функции.

    Об"явления переменной на внешнем уровне

    Об"явления переменной на внешнем уровне используют спецификаторы класса

    памяти static и extern или совсем опускают их. Спецификаторы класса памяти

    auto и register не допускаются на внешнем уровне.

    Об"явления переменных на внешнем уровне- это определения переменных

    или ссылки на определения, сделанные в другом месте.

    Об"явление внешней переменной, которое инициализирует эту

    переменную (явно или неявно), называется определением этой переменной.

    Определение на внешнем уровне может задаваться в следующих различных

    формах:

    -переменная на внешнем уровне может быть определена путем ее

    об"явления со спецификатором класса памяти static. Такая переменная может

    быть явно инициализирована константным выражением. Если инициализатор

    отсутствует, то переменная автоматически инициализируется нулем во время

    компиляции. Таким образом, об"явления static int k = 16; и static int

    k; оба рассматриваются как определения;

    -переменная определяется, когда она явно инициализируется

    на внешнем уровне. Например, int j = 3; это определение переменной.

    Так как переменная определяется на внешнем уровне, то она видима в

    пределах остатка исходного файла, от места, где она определена. Переменная

    не видима выше своего определения в том же самом исходном файле ни в

    других исходных файлах программы, если не об"явлена ссылка, которая делает

    ее видимой.

    Переменная может быть определена на внешнем уровне внутри исходного

    файла только один раз. Если задается спецификатор класса памяти static, то

    в других исходных файлах могут быть определены переменные с тем же

    именем. Так как каждое определение static видимо только в пределах

    своего собственного исходного файла, то конфликта не возникнет.

    Спецификатор класса памяти extern используется для об"явления ссылки на

    переменную, определенную где-то в другом месте. Такие об"явления

    используются в случае, когда нужно сделать видимым определение переменной в

    других исходных файлах или выше места, где она определена в том же самом

    исходном файле. Так как ссылка на переменную об"явлена на внешнем уровне,

    то переменная видима в пределах остатка исходного файла от места об"явления

    ссылки.

    В об"явлениях, которые используют спецификатор класса памяти extern,

    инициализация не допускается, так как они ссылаются на переменные, чьи

    величины уже определены.

    Переменная, на которую делается ссылка extern, должна быть определена

    на внешнем уровне только один раз. Определение может быть сделано в любом

    из исходных файлов, составляющих программу.

    Есть одно исключение из правил, описанных выше. Можно опус-

    тить из об"явления переменной на внешнем уровне спецификатор класса

    памяти и инициализатор. Например, об"явление int n; будет правильным

    внешним об"явлением. Это об"явление имеет два различных смысла в

    зависимости от контекста.

    1. Если где-нибудь в программе будет определена на внешнем уровне

    переменная с тем же именем, то об"явление является ссылкой на эту

    переменную, как если бы был использован спецификатор класса памяти extern в

    об"явлении.

    2. Если нет такого определения, то об"явленной переменной

    распределяется память во время линкования и переменная инициализируется

    нулем. Если в программе появится более чем одно такое об"явление, то

    память распределится для наибольшего размера из об"явленных переменных.

    Например, если программа содержит два неинициализированных об"явления

    переменной i на внешнем уровне int i; и char i; то память во время

    линкования распределится под переменную i типа int.

    Неинициализированные об"явления переменной на внешнем уровне не

    рекомендуются для файлов, которые могут быть размещены в библиотеку.

    Пример:

    /*****************************************************

    SOURCE FILE ONE

    *****************************************************/

    extern int i; /* reference to i

    defined below */

    main()

    {

    i++;

    printf("%d\n", i); /* i equals 4 */

    next();

    }

    int i = 3; /* definition of i */

    next()

    {

    i++;

    printf("%d\n", i); /* i equals 5 */

    other();

    }

    /***************************************************** SOURCE FILE

    TWO

    *****************************************************/

    extern int i; /* reference to i in

    first source file */

    other()

    {

    i++;

    printf("%d\n", i); /* i equals 6 */

    }

    Два исходных файла в совокупности содержат три внешних об"явления

    i. Одно об"явление содержит инициализацию- int i = 3; , где глобальная

    переменная i определена с начальным значением равным 3.

    Самое первое об"явление extern в первом файле делает глобальную

    переменную видимой выше ее определения в файле.

    Без об"явления extern функция main не смогла бы сослаться на

    глобальную переменную i. Об"явление extern переменной i во втором

    исходном файле делает глобальную переменную видимой в этом исходном файле.

    Все три функции выполняют одну и ту же задачу: они увеличивают i на 1 и

    печатают получившееся значение. (Предполагается, что функция printf

    определена где-то еще в программе.). Печатаются величины равные 4, 5 и 6.

    Если бы переменная i не была бы инициализирована,она бы была

    автоматически установлена в 0 при линковании. В этом случае напечатанные

    значения были бы равны 1, 2 и 3.

    Об"явление переменной на внутреннем уровне

    Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11


    Приглашения

    09.12.2013 - 16.12.2013

    Международный конкурс хореографического искусства в рамках Международного фестиваля искусств «РОЖДЕСТВЕНСКАЯ АНДОРРА»

    09.12.2013 - 16.12.2013

    Международный конкурс хорового искусства в АНДОРРЕ «РОЖДЕСТВЕНСКАЯ АНДОРРА»




    Copyright © 2012 г.
    При использовании материалов - ссылка на сайт обязательна.