рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Внешние переменные

Внешние переменные - раздел Электроника, ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ Объекты, Размещаемые В Статической Памяти, Декларируются С Атрибутом ...

Объекты, размещаемые в статической памяти, декларируются с атрибутом static и могут иметь любой атрибут области действия. Глобальные объекты всегда являются статическими. Атрибут static, использованный при описании глобального объекта, предписывает ограничение его области применимости только в пределах остатка текущего файла. Значения локальных статических объектов сохраняются при повторном вызове функции. Таким образом, в языке С ключевое слово static имеет разный смысл для локальных и глобальных объектов.

Переменная, описанная вне функции, является внешней переменной. Их еще называют глобальными переменными.

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

Внешние переменные существуют постоянно. Они сохраняют свои значения и после того, как функции, присвоившие им эти значения, завершат свою работу.

При отсутствии явной инициализации для внешних и статических переменных гарантируется их обнуление, автоматические и регистровые переменные имеют неопределенные начальные значения («мусор»).

Внешняя переменная должна быть определена вне всех функций. При этом ей выделяется фактическое место в памяти. Такая переменная должна быть описана в каждой функции, которая собирается ее использовать. Это можно сделать либо явным описанием extern, либо по контексту.

Чтобы функция могла использовать внешнюю переменную, ей нужно сообщить идентификатор этой переменной. Один из способов - включить в функцию описание extern.

В определенных ситуациях описание extern может быть опущено: если внешнее определение переменной находится в том же файле, раньше ее использования в некоторой конкретной функции, то не обязательно включать описание extern для этой переменной в саму функцию. Фактически, обычная практика заключается в помещении определений всех переменных в начале исходного файла и последующем опусканием всех описаний extern.

Включение ключевого слова extern позволяет функции использовать внешнюю переменную, даже если она определяется позже в этом или другом файле.

Важно различать описание внешней переменной и ее определение. Описание указывает свойство переменной, ее размер, тип и т. д.; определение же вызывает еще и отведение памяти. Например, если вне какой-либо функции появляются строчки:

int sp;

double val[20];

то они определяют внешние переменные sp и val, вызывают отведение памяти для них и служат в качестве описания для остальной части этого исходного файла. В то же время строчки:

extern int sp;

extern double val [];

описывают в остальной части этого исходного файла переменную sp как int, а vol как массив типа double, но не создают переменных и не отводят им места в памяти.

Во всех файлах, составляющих исходную программу, должно содержаться только одно определение внешней переменной. Другие файлы могут содержать описание extern для доступа к ней.

Любая инициализация внешней переменной проводится только в декларации. В декларации должны указываться размеры массивов, а в описании extern этого можно не делать.

Например, в файле 1:

int sp = 0;

double val [20];

...

в файле 2:

extern int sp;

extern double val [];

...

В Си есть возможность с помощью #include иметь во всей программе только одну копию описаний extern и вставлять ее в каждый файл во время его компиляции.

Если переменная с таким же идентификатором как внешняя декларирована в функции без указания extern, то тем самым она становится внутренней в данной функции.

Не стоит злоупотреблять внешними переменными. Такой стиль программирования приводит к программам, связи данных внутри которых не вполне очевидны. Переменные при этом могут изменяться неожиданным образом. Программу становится трудно модифицировать.

 

Файл 1: Файл 2:
int x, y; char str[ ] = “Rezult = ”;   void main(void) { . . . }   void fun1(void) { y = 15; cout << str << y; }   extern int x, y; extern char str[ ]; int r, q; void fun2(void) { x = y / 5; cout << str << x; }   void fun3(void) { int z= x + y; cout << str << z; }  

 

16.4. Область действия переменных

В языке С нет ключевого слова, указывающего область действия объекта. Область действия определяется местоположением декларации объекта в файле исходного текста программы (любой объект полностью описывается в одном операторе).

Напомним общую структуру исходного текста программ на языке С:

<директивы препроцессора>

<описание глобальных объектов>

<заголовок функции>

{

<описание локальных объектов>

<список инструкций>

}

Файл исходного текста может включать любое количество определений функций и/или глобальных данных.

Параметры функции являются локальными объектами и должны отличаться по идентификаторам от используемых в коде функции глобальных объектов. Локальные объекты, описанные в коде функции, имеют приоритет перед объектами, описанными вне функции, например:

. . .

int n; // глобальное n

void main (void) {

int i;

...

f1(i);

...

f2(n); // локальное n

}

f1(int i) {

...

i=n; // глобальное n

...

}

f2(int n) {

int i;

...

i=n; // локальное n

...

}

 

В любом месте файла исходного текста можно ссылаться на глобальные объекты, определенные ниже в остатке текущего файла или в других файлах. Для этого необходимо описать тип объекта и добавить к описанию ключевое слово extern. Описания функций подразумевают атрибут extern по умолчанию. Разрешается опускать длину внешних одномерных массивов, но операция sizeof к таким массивам становится бессмысленной.

Следует учитывать, что любая декларация объекта действует только на остаток файла исходного текста.

В С++ допускается в разных блоках программы использовать один и тот же идентификатор объекта, тогда более внутреннее объявление объекта скрывает доступ к объекту на более высоком уровне декларации.

void main(void) {

int i = 3;

cout << “\n Block 1 - “ << i ;

{

float i = 2.5;

cout << “\n Block 2 - “ << i ;

{

char i = ‘a’;

cout << “\n Block 3 - “ << i ;

}

}

cout << “\n New Block 1 - “ << ++i ;

getch();

}

В результате выполнения этой программы, на экране получим:

Block 1 - 3

Block 2 - 2.5

Block 3 - a

New Block 1 - 4

 

– Конец работы –

Эта тема принадлежит разделу:

ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ

Министерство образования Республики Беларусь... Учреждение образования БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Внешние переменные

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

Структура ПЭВМ
ПЭВМ содержат клавиатуру, системный блок, и дисплей. Схема ПЭВМ представлена на рис. 1.     Р

Размещение данных и программ в памяти ПЭВМ
Данные и программы во время работы ПЭВМ размещаются в оперативной памяти, которая представляет собой последовательность пронумерованных ячеек. По указанному номеру процессор находит нужную ячейку,

Программные модули
Про­грам­мист пишет программу на языке высокого уровня, т.е. наиболее удобном для записи алгоритма решения определенного класса задач. Исходный текст программы, введенный с

Функциональная и модульная декомпозиции
Для большинства задач алгоритмы их решения являются довольно большими и громоздкими. При программировании нужно стараться получить программу удобочитаемую, высокоэффективную и легко модифицируемую.

Файловая система хранения информации
Для размещения информации и программ на различных устройствах компьютера, необходимых пользователю, была разработана концепция файлов. Под файлом понимается поимено

Способы описания алгоритмов
Существует несколько способов описания алгоритмов. Наиболее распро­стра­ненными являются словесное и графическое описания алгоритма. Словесное описание алгоритма рассм

Основные символы схемы алгоритма
Символы ввода-вывода данных: - данные ввода/вывода (носитель не определен);  

Немного истории
Алгоритмический язык С был разработан в 1972 г. сотрудником фирмы AT&T Bell Laboratory Денисом Ритчи на базе языка В (автор К.Томпсон), который в свою очередь основывался на языке системного пр

Алфавит языка
Каждому из множества значений, определяемых одним байтом, - от 0 до 255, ‑ в таблице знакогенератора вычислительной машины ставится в соответствие символ. По системе кодировки фирмы IBM симво

Идентификаторы и ключевые слова
Идентификатор (в дальнейшем, для краткости - ID) – это имя программного объекта (константы, переменной, метки, типа, функции, модуля, поля в структуре). В иден

Простейшая программа
Программа написанная на языке Си состоит из одной или нескольких функций, причем одна функция обязательна имеет идентификатор (имя) main() – основная, главная. Ее назначение – управление всей работ

Основные типы данных
Данные в языке Си разделяются на две категории: простые (скалярные), будем их называть базовыми, и сложные (составные) типы данных. Основные типы базовых данных: стандартный целый (int), в

Целочисленные константы
Общий формат: ±n (+ обычно не ставится). Десятичные константы - последовательность цифр 0...9, первая из которых не должна быть 0. Например, 22 и 273 - обычные целые констант

Символьные константы
Символьная константа - это символ, заключенный в одинарные кавычки: 'A', 'х' (занимает 1 байт). Тип char ® целое int. Так же используются специальные последовательности симво

Преобразование типов операндов арифметических операций
При выполнении операций могут встречаться операнды различных типов. В этом случае они преобразуются к общему типу в соответствии с небольшим набором правил. Типы операндов преобразуются в

Операция приведения типа
В любом выражении преобразование типов может быть осуществлено явно. Для этого достаточно перед любым выражением поставить в скобках идентификатор соответствующего типа. Вид записи операци

Стандартные математические функции
Математические функции алгоритмического языка Си декларированы в файлах <math.h> и <stdlib.h>. В последующих записях аргументы x и y имеют тип double; параметр n им

Функции вывода данных на дисплей
Для вывода информации в языке Си чаще всего используются функции: printf() и puts(). Формат функции printf(): printf((<управляющая строка>, список объектов

Функции ввода информации
Функция scanf() предназначена для форматированного ввода исходной информации с клавиатуры Общий вид этой функции: scanf (<управляющая строка>, список адресо

Ввод - вывод потоками
Поток - это абстрактное понятие расширенной версии языка С, которое относится к любому переносу данных от источника к приемнику. Чтение данных из потока - это извлечение (extraction).

Указатели
Указатель – это переменная, которая может содержать адрес некоторого объекта. Указатель объявляется следующим образом: <тип> *< ID переменной-указателя>;

Понятие массива
В математике для удобства записи различных операций часто используют индексированные переменные: векторы, матрицы, тензоры. Так, вектор пред

Одномерные массивы
Индексы у одномерных массивов в языке Си начинаются с 0, а в программе одномерный массив объявляется следующим образом: <тип> < ID_массива>[размер]={список начальных значений};

Операция sizeof
Данная операция позволяет определить размер объекта по ID или типу, результатом является размер памяти в байтах (тип результата int). Формат записи: sizeof(параметр

Применение указателей
Идентификатор массива – это адрес памяти, начиная с которого он расположен, т.е. адрес его первого элемента. Работа с массивами тесно связана с применением указателей. Пусть объявлены масс

Указатели на указатели
В языке Си можно описать переменную типа «указатель на указатель». Это ячейка оперативной памяти, в которой будет храниться адрес указателя на какую либо переменную. Признак такого типа данных – по

Адресная функция
Использование многомерных массивов в языке Си связано с расходами оперативной памяти на массивы указателей. Можно избежать таких расходов, если ввести адресную функцию для доступа к элемен

Работа с динамической памятью
  В языке С размерность массива при объявлении должна задаваться константным выражением. При необходимости работы с массивами перемен­ной размерности вместо массива достаточно объявит

Строки в языке Си
  В языке Си отдельного типа данных «строки символов» нет. Работа со строками реализована путем использования одномерных массивов типа char, т.е. строка символов – это одномерный масс

Русификация под Visual
При работе в консольном приложении Visual ввод-вывод выполняется в кодировке ASCII, которая является международной только в первой половине кодов (от 0 до 127, см. Приложение 1). Символы национальн

Декларация функции
Как объект языка Си, функцию необходимо объявить. Объявление функции пользователя, т.е. ее декларация, выполняется в двух формах – в форме описания и в форме определения. Описание функции

Вызов функции
Вызов функции имеет следующий формат: ID _функции (список_аргументов); где в качестве аргументов можно использовать константы, переменные, выражения (их значения перед вызо

Операция typedef
Любому типу данных, как стандартному, так и определенному пользователем, можно задать новое имя с помощью операции typedef: typedef <тип> <новое_имя>;

Параметры командной строки функции main
Функция main, с которой начинается выполнение программы, может быть определена с параметрами, которые передаются из внешнего окружения, например, из командной строки. Во внешнем окружении действуют

Функции с переменным числом параметров
Иногда нельзя перечислить типы и число всех возможных параметров функции. В этих случаях список параметров представляется многоточием (...), которое отключает механизм проверки типов. Наличие много

Автоматические переменные
Переменные, декларированные внутри функций, являются внутренними и называются локальными переменными. Никакая другая функция не имеет прямого доступа к ним. Такие объекты существуют временно

Декларация структурного типа данных
Структурный тип данных задается в виде шаблона, общий формат описания которого следующий: struct ID структурного типа { описание полей }; Атрибут «ID структурног

Создание структурных переменных
Как уже отмечалось само описание структуры не приводит к выделению под нее места в ОП. Теперь необходимо создать нужное количество переменных с приведенной структурой и сделать это можно двумя спос

Вложенные структуры
Структуры могут быть вложенными, т.е. поле структуры может связующим полем с внутренней структурой, описание которой должно предшествовать по отношению к основному шаблону. Например, в стр

Объединения
Объединение - поименованная совокупность данных разных типов, размещаемых с учетом выравнивания в одной и той же области памяти, размер которой достаточен для хранения наибольшего элемента.

Перечисления
Перечисления - средство создания типа данных посредством задания ограниченного множества значений. Определение перечислимого типа данных имеет вид enum ID_

Открытие файла
Каждому файлу присваивается внутреннее логическое имя, используемое в дальнейшем при обращении к нему. Логическое имя (идентификатор файла) - это указатель на файл, т.е. на область памяти, где соде

Закрытие файла
После работы с файлом доступ к нему необходимо закрыть. Это выполняет функция int fclose(указатель файла). Например, из предыдущего примера файл закрывается так: fclose (f);

Блоковый ввод-вывод
В функциях блокового ввода-вывода работа происходит с целыми блоками информации: int fread(void *p, int size, int n, FILE *f) - считывает n блоков

Бинарные файлы
Бинарные (двоичные) файлы обычно используются для организации баз данных, состоящих, как правило, из объектов структурного типа. При чтении-записи бинарных файлов удобнее всего пользоваться функция

Макрозамещение
Макрозамещение - обобщение лексемного замещения посредством параметризации строки директивы define в виде: #define ID(параметр1,... ) строка здесь между элементом «ID» и открывающ

Подключение файлов исходного текста
Напомним, что имеются два варианта запроса включения в текущий файл содержимого другого файла. Директива: #include < ID_файла> вводит содержимое файла из стандартного катало

Условная компиляция
Директивы условной компиляции и реализуемые правила включения исходного текста: а) условное включение (аналог работы оператора if): #if<предикат_условия> ТЕКСТ_1

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги