Область видимости объектов: локальные и глобальные объекты

Область видимости объектов

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

Локальные и глобальные объекты

Время жизни объекта может быть глобальным и локальным.

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

Локальными называют объекты, объявление которых дано внутри блока или функции. Эти объекты доступны только внутри того блока, в котором они объявлены. Объектам с локальным временем жизни выделяется новая ячейка памяти каждый раз при осуществлении описания внутри блока. Когда выполнение блока завершается, память, выделенная под локальный объект, освобождается, и объект теряет своё значение.

Пример

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
void autofunc(void)
{
  int k = 1;    // локальный объект
  printf(" \n k = %d ", k);
  k = k + 1;
}
int main()
{
  for (int i = 0; i <= 5; i++) // область видимости i - цикл
    autofunc();
  getchar();
  return 0;
}

Область видимости локальной переменной k — функция autofunc(). Каждый раз при входе в функцию с идентификатором k ассоциируется некоторая ячейка памяти, в которую помещается значение равное 1.

Результат выполнения программы

Локальная переменная k

Та же программа, но с использованием глобального объекта

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int k = 1; // глобальный объект
void autofunc(void)
{
  printf(" \n k = %d ", k);
  k = k + 1;
}
int main()
{
  for (int i = 0; i <= 5; i++)  // область видимости i - цикл
    autofunc();
  getchar();
  return 0;
}

Результат выполнения программы

Глобальная переменная k

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

Пример

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int x, y, z;   // глобальные переменные
void sum(void)
{
  z = x + y;
}
int main()
{
  printf("x= ");
  scanf("%d", &x);
  printf("y= ");
  scanf("%d", &y);
  sum();
  printf("z= %d", z);
  getchar(); getchar();
  return 0;
}

Результат выполнения

Использование глобальных переменных

Модификация объектов

Модификация или видоизменение объектов в языке Си применяется для того, чтобы изменить диапазон значений или область действия объекта. Ключевые слова, которые применяются для модификации, называются модификаторами.

Модификатор unsigned предназначен для того, чтобы объявлять беззнаковую целочисленную переменную, тем самым изменив диапазон представления этой переменной.

Модификатор extern предназначен для использования в данном программном модуле объекта, который объявлен в другом программном модуле.

Файл 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int x, y, z;
extern void func(void);
int main()
{
  printf("x= ");
  scanf("%d", &x);
  printf("y= ");
  scanf("%d", &y);
  func();
  printf("z= %d", z);
  getchar(); getchar();
  return 0;
}

Файл 2

1
2
3
4
5
extern int x, y, z;
void func(void)
{
  z = x + y;
}

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

Модификатор extern

Модификатор static позволяет связать с идентификатором фиксированный адрес (ячейку памяти). Если объект расположен по некоторому фиксированному адресу, то он называется статическим.

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

Пример

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
void autofunc(void)
{
  static int k = 1;   // статический объект
  printf(" \n k = %d ", k);
  k = k + 1;
}
int main()
{
  for (int i = 0; i <= 5; i++)
    autofunc();
  getchar();
  return 0;
}

Переменная k в функции autofunc() зафиксирована в оперативной  памяти.

Инициализация k проводится только один раз — при первом вызове функции. При повторном обращении к функции autofunc() инициализация переменной k не будет производиться. Значение переменной k и ее адрес сохраняются в оперативной памяти, однако эта переменная не будет доступна из других функций.

Результат выполнения программы

Статическая переменная k

Модификатор register предназначен для того, чтобы поместить переменную в один из регистров общего назначения центрального процессора при наличии свободного регистра. Благодаря этому повышается скорость работы с данными. Это необходимо для создания управляющих программ, где требуется высокая скорость обработки данных.

Пример

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main()
{
  register int a = 0;
  for (int i = 1; i < 10; i++)
    a += i;
  printf("%d", a);
  getchar();
  return 0;
}

Прокрутить вверх