Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Переменные в C: объявление, определение, инициализация, область видимости и классы хранения

Что такое переменная?

Переменная — именованная область памяти, которая хранит значение определённого типа. Имя переменной — это идентификатор, связанный с адресом в памяти.

Объявление vs Определение

extern int a;      // только объявление (нет памяти)
int b;             // определение (память выделена, значение неопределено)
int c = 42;        // определение с инициализацией
static int d = 10; // определение с внутренней линковкой

Базовые типы переменных

ТипОписаниеРазмер (тип.)
char1 байт, целое / символ1
intЦелое «естественного» размера4
floatОдинарная точность4
doubleДвойная точность8
voidОтсутствие типа (только для указателей/функций)—

Также: short, long, long long, signed/unsigned модификаторы, _Bool (C99), stdint.h типы.

Инициализация

int a = 10;           // копирующая инициализация
int b(20);            // ошибка в C! Это C++ синтаксис
int c = {30};         // список инициализации (C99, для структур/массивов)
int d = 10, e = 20;   // несколько в одном объявлении
const int LIMIT = 100;// константа (read-only)

Автоматическая инициализация

Класс хранения / областьНачальное значение
Глобальные / static (файл или функция)Нулевое: 0, 0.0, NULL, '\0'
Локальные (auto, register)Неинициализированы — мусор в памяти (UB при чтении)
Динамические (malloc)Неинициализированы (мусор)
calloc, callocОбнулены

Правило: всегда инициализируйте локальные переменные при объявлении.

Область видимости (Scope) и время жизни (Lifetime)

Тип переменнойОбласть видимостиВремя жизниПример
Локальная (auto)Блок {...} где объявленаВход в блок → выход из блокаvoid f() { int x; }
Глобальная (file scope)Весь файл после объявления (все функции)Запуск программы → завершениеint g; void f() {}
Static локальнаяБлок, где объявленаЗапуск → завершение программыvoid f() { static int x; }
Static глобальнаяТолько этот файл (внутренняя линковка)Запуск → завершениеstatic int g;
Extern глобальнаяВся программа (внешняя линковка)Запуск → завершениеextern int g; в другом файле
Параметры функцииТело функцииВход в функцию → выходvoid f(int x)

Классы хранения (Storage Classes)

КлассКлючевое словоОбластьЖизньЛинковкаИнициализация по умолчанию
Автоматическийauto (по умолчанию)БлокБлокНетМусор
РегистровыйregisterБлокБлокНетМусор
Статический (локальный)staticБлокПрограммаНет0
Статический (глобальный)staticФайлПрограммаВнутренняя0
ВнешнийexternПрограммаПрограммаВнешняя0 (если определение)

auto

Явное указание автоматического класса хранения. В современном C используется редко (подразумевается по умолчанию для локальных переменных). Не путать с C++11 auto (вывод типа)!

register

Подсказка компилятору: «храни в регистре процессора». Нельзя взять адрес (&var — ошибка). Современные компиляторы сами лучше решают, что положить в регистры. Используется редко.

static (локальный)

Сохраняет значение между вызовами функции:

void counter() {
    static int count = 0; // инициализируется ОДИН раз
    count++;
    printf("%d\n", count);
}
counter(); // 1
counter(); // 2
counter(); // 3

static (глобальный)

Ограничивает видимость файлом (internal linkage). Предотвращает конфликты имен при линковке.

extern

Объявление переменной, определённой в другом файле:

// file1.c
int global_counter = 0; // определение

// file2.c
extern int global_counter; // объявление
void use_it() { global_counter++; }

Компиляция: gcc file1.c file2.c -o prog.

Lvalues и Rvalues

int x = 10;   // x — lvalue, 10 — rvalue
x = 20;       // OK
10 = 20;      // ОШИБКА: 10 — rvalue, нельзя присваивать
int *p = &x;  // &x требует lvalue
*p = 30;      // *p — lvalue

Пример: демонстрация областей видимости

#include <stdio.h>

int global = 100;        // глобальная, внешняя линковка
static int file_static = 200; // глобальная, внутренняя линковка

void func(int param) {   // param — формальный параметр
    int local = 10;      // локальная (auto)
    static int static_local = 0; // статическая локальная
    
    printf("global=%d, file_static=%d, param=%d, local=%d, static_local=%d\n",
           global, file_static, param, local, static_local);
    
    static_local++;
    local = 999; // изменится только в этом вызове
}

int main() {
    func(1);
    func(2);
    func(3);
    // local сбрасывается каждый вызов, static_local накапливает
    return 0;
}

Язык C

  1. Мастерство C# переменных и примитивных типов данных: полное руководство
  2. Область видимости переменных в C#: класс, метод и блок
  3. Освоение переменных, литералов и констант в C++: подробное руководство
  4. Переменные, константы и литералы в C: полное руководство
  5. Классы хранения в C: область видимости, время жизни и производительность
  6. Ключевое слово global в Python: как и когда использовать
  7. Переменные и литералы в Java: подробное руководство
  8. Переменные и типы данных в C++: подробное руководство по int, double, char, string, bool
  9. Понимание назначений в Verilog: типы, синтаксис и лучшие практики
  10. Типы переменных в Java: локальные, экземпляра и статические