DEV Community

Amirshokh
Amirshokh

Posted on

Язык программирования Си. Глава(Chapter) 12

  1. В C объект(не экземпляр класса) - это аппаратный(hardware) аспект участка памяти, который имеет соответствующий определённому типу размер и может сохранять одно или несколько значений, а программный(software) аспект - это идентификатор(identifier), имя переменной(variable name)(int arr[10]; arr - объект из 10 объектов типа int), или выражение(expression), которое обозначает(designates) объект(ptr + 2 * COLS;(не объект, l-value), *(ptr + 2 * COLS);(модифицируемый(modifiable) l-value)

  2. Область видимости(Scope): в пределах блока, всё внутри {}(переменная объявленная внутри блока и формальные параметры функции), также в пределах функции(метка(label) goto, то есть start: достижима из любого блока функции), ещё в пределах прототипа функции(имена параметров, которых может и не быть, не важны, но не должны переопределяться в этой области видимости) и наконец, в пределах файла(file) или единицы трансляции(translation unit)(файл после вставки всех функций заголовочных файлов препроцессором), иначе просто глобальные переменные(global variables)

  3. Связывание(Linkage) есть только у объектов с областью видимости в пределах файла: внешнее(external), иначе глобальная область видимости(global scope) или область видимости в пределах программы(program scope), виден в любом месте многофайловой программы, также внутреннее(internal), иначе область видимости в пределах файла(file scope), виден в единице трансляции(используется static). Отсутствует у переменных в блоке, функций и прототипов функций

  4. Продолжительность хранения(Storage Duration): статическая(static), инициализируется одиножды при компиляции(автоматически нулём, а иначе константным значением), а хранится от загрузки до завершения программы с областью видимости в пределах файла, можно и в блоке(используется static), потоковая(thread) существует с момента объявления объекта и до завершения потока(используется _Thread_local), автоматическая(automatic)(реализован как стек(stack)) у объектов с областью видимости в пределах блока где переиспользуется рабочая или временная память из-за чего переменные имеют мусорное значение(VLA виден после объявления)(может использоваться auto) и выделенная(allocated)(используются функции)

  5. Модели или Классы хранения(Storage Class Caveat) и их спецификаторы(несовместимы с typedef и могут быть использованы не более одного раза) в отношении переменных и функций(внешние по умолчанию, статические и встраиваемые в C99): автоматический(automatic), при переопределении внутри блока переменная скрывает(hides) внешнее определение(auto int num;, int auto num; и int num; в блоке идентичны(auto в C++ это не класс хранения)), также регистровый(register), запрос у компилятора поместить переменную в регистр процессора(используется register), у которого нельзя взять адрес, а ещё статический(используется static) с областью видимости в пределах блока(static with block scope) или локальная статическая переменная(local static variable)(не является оператором блока), вдобавок статический с внешним связыванием(static with external linkage) для использования переменной определённой в другом файле, когда повторная инициализация ошибочна, а объявление обязательно(используется extern)(int arr[10]; — определяющее(defining) объявление в main.c и extern int arr[]; — ссылочное(referencing) объявление в additional.c) и статический с внутренним связыванием(static with internal linkage) виден одному файлу(используется static)

  6. Блок без фигурных скобок в C99(поддерживают не все компиляторы): выражение внутри операторов(if, while) является подблоком полного оператора, а тело подблоком подблока({if(statement){operators}})

  7. Квалификаторы типов(Type Qualifiers) в ANSI C(const - немодифицируемость, volatile - зависимость от внепрограммного воздействия), в C99(restrict - единственное первичное средство доступа к блоку данных(используют некоторые функции стандартной библиотеки)) и в C11(_Atomic в stdatomic.h), все являются идемпотентными(idempotent) в C99: const const int const var; == const int var; == int const var;

  8. Новые места для старых ключевых слов(только в контексте формальных параметров) в C99: взаимозаменяемость int * const ptr на int * ptr[const], const char * restrict str на const char * str[restrict], и новое int arrstatic 20

  9. Выделенная память(Allocated Memory): malloc(), calloc()(устанавливает все биты нулём), free() в stdlib.h; динамически-созданный массив(dynamic array) похож на VLA, необязательное в C(в C++ обязательное) приведение возвращаемого типа void * к другому типу(char * или struct structname *), хранение в куче(memory heap) или свободном хранилище(free storage) и проблема утечки памяти(memory leak)

  10. Реализация функций rand() и srand() в stdlib.h, также time() и time_t(обычно приводится к unsigned int) в time.h

  11. exit()(и его отличие от return), EXIT_SUCCESS(эквивалентно 0) и EXIT_FAILURE в stdlib.h

Заметка от себя: на самом деле ссылочное(referencing) объявление переменной с помощью extern это то же, что и обычное объявление(declaration) функции без определения.

Язык программирования Си 6 издание. Стивен Прата
C Primer Plus 6th edition. Stephen Prata

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay