мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| c:c_ultimate_guide:storage_classes [2025/10/10 12:10] – создано radi0dev | c:c_ultimate_guide:storage_classes [2025/11/09 12:07] (текущий) – внешнее изменение A User Not Logged in | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== классы хранения ====== | ====== классы хранения ====== | ||
| + | |||
| + | В Си существует четыре основных класса хранения: | ||
| + | |||
| + | ===== auto ===== | ||
| + | |||
| + | Класс хранения auto является классом по умолчанию для всех **локальных**((Это означает, | ||
| + | |||
| + | * Область видимости: | ||
| + | * Жизненный цикл: переменная создается при входе в блок и уничтожается при выходе из него. | ||
| + | * Начальное значение: | ||
| + | |||
| + | <code c> | ||
| + | void myFunction() { | ||
| + | int a; // То же самое, что и "auto int a;"" | ||
| + | a = 10; | ||
| + | // a доступна только внутри myFunction | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== extern ===== | ||
| + | |||
| + | Используется для объявления глобальной переменной или функции, | ||
| + | |||
| + | * Область видимости: | ||
| + | * Жизненный цикл: существует в течение всего времени выполнения программы. | ||
| + | * Начальное значение: | ||
| + | |||
| + | |||
| + | <code c> | ||
| + | // main.c | ||
| + | #include < | ||
| + | |||
| + | char message[] = " | ||
| + | |||
| + | void print() { | ||
| + | printf(" | ||
| + | } | ||
| + | int sum(int x, int y) { | ||
| + | return x + y; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <code c> | ||
| + | //app.c | ||
| + | #include < | ||
| + | |||
| + | extern char message[]; // переменная message из файла main.c | ||
| + | void print(void); | ||
| + | int sum(int, int); // функция sum из main.c | ||
| + | |||
| + | int main(void){ | ||
| + | // выводим на консоль внешнюю переменную message | ||
| + | printf(" | ||
| + | | ||
| + | // вызываем внешнюю функцию print | ||
| + | print(); | ||
| + | | ||
| + | // вызываем другую внешнюю функцию - sum | ||
| + | printf(" | ||
| + | | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== static ===== | ||
| + | |||
| + | Ключевое слово static имеет два основных применения в зависимости от контекста: | ||
| + | |||
| + | Когда static применяется к **локальной** переменной, | ||
| + | |||
| + | * Область видимости: | ||
| + | * Жизненный цикл: Существует в течение всего времени выполнения программы, | ||
| + | * Начальное значение: | ||
| + | |||
| + | Когда static применяется к **глобальной** переменной или функции, | ||
| + | |||
| + | * Область видимости: | ||
| + | * Жизненный цикл: переменная/ | ||
| + | |||
| + | ===== register ===== | ||
| + | |||
| + | Класс хранения register является рекомендацией для компилятора поместить переменную не в оперативную память, | ||
| + | |||
| + | < | ||
| + | Однако в современных компиляторах register почти не используется, | ||
| + | </ | ||
| + | |||
| + | * Область видимости: | ||
| + | * Жизненный цикл: Локальный. | ||
| + | |||
| + | <note important> | ||
| + | К register-переменной нельзя применить оператор взятия адреса &, так как у нее нет адреса в памяти. | ||
| + | </ | ||