C Правила области видимости

В любом виде программирования область видимости — это область, в которой существуют переменные, определённые в программе; за пределами этой области к переменным нельзя получить доступ. В языке C есть три места, где можно объявить переменные:

  1. Внутри функции или блокаЛокальнаяпеременная
  2. Вне всех функцийглобальнаяпеременная
  3. Вформеопределения параметров функции

Давайте посмотрим, что такоелокальныепеременные,глобальныепеременные иформальныепараметры.

Локальные переменные

Переменные, объявленные внутри функции или блока, называются локальными переменными. Они могут использоваться только операторами внутри этой функции или блока кода. Локальные переменные не известны за пределами функции. Вот пример использования локальных переменных. Здесь все переменные a, b и c являются локальными переменными функции main().

Пример

#include <stdio.h> int main () { /*Объявление локальной переменной*/ int a, b; int c; /*фактическая инициализация*/ a = 10; b = 20; c = a + b; printf ("значение a = %d, b = %d и c = %d\n", a, b, c); return 0; }

Глобальные переменные

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

К глобальным переменным можно получить доступ из любой функции. То есть после объявления глобальной переменной она доступна во всей программе. Ниже приведён пример использования глобальных и локальных переменных:

Пример

#include <stdio.h> /*Объявление глобальной переменной*/ int g; int main () { /*Объявление локальной переменной*/ int a, b; /*фактическая инициализация*/ a = 10; b = 20; g = a + b; printf ("значение a = %d, b = %d и g = %d\n", a, b, g); return 0; }

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

В программе локальные переменные и глобальные переменные

Пример

#include <stdio.h> /*Объявление глобальной переменной*/ int g = 20; int main () { /*Объявление локальной переменной*/ int g = 10; printf ("значение g = %d\n", g); return 0; }

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

value of g = 10

Формальные параметры

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

Пример

#include <stdio.h> /*Объявление глобальной переменной*/ int a = 20; int main () { /*Объявления локальных переменных в функции main*/ int a = 10; int b = 20; int c = 0; int sum(int, int); printf ("значение a в main() = %d\n", a); c = sum( a, b); printf ("значение c в main() = %d\n", c); return 0; } /*Функция для сложения двух целых чисел*/ int sum(int a, int⟦⟧printf b) { printf ("значение a в sum() = %d\n", a); printf ("значение b в sum() = %d\n", b); return a + b; }

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

value of a in main() = 10
value of a in sum() = 10
value of b in sum() = 20
value of c in main() = 30

Разница между глобальными переменными и локальными переменными в памяти:

  • Глобальные переменные хранятся в глобальной области памяти, занимая статические ячейки памяти;
  • Локальные переменные хранятся в стеке, и ячейки памяти для переменных динамически выделяются только при вызове функции, в которой они находятся.

Дополнительную информацию см. в:Использование static в C/C++: глобальные и локальные переменные

Инициализация локальных и глобальных переменных

Когда определяется локальная переменная, система не инициализирует её; вы должны инициализировать её самостоятельно. При определении глобальной переменной система автоматически инициализирует её, как показано ниже:

Типы данныхИнициализация значений по умолчанию
int 0
char '\0'
float 0
double 0
указатель NULL

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

Другие расширения