По языку C написано множество
руководства и учебных пособий. Ещё одной
особенностью C является то, что
первоначально исчерпывающие руководства по языку
написаны его авторами (Б.
Керниган, Д. Ритчи), выдержавшими 34
переиздания в США. Это очень способствовало
краткости и однозначности толкований
понятий языка, и простоте его освоения.
Есть
ли смысл, при такой истории и таком
объёме существующих описаний, снова
обращаться к деталям языка C? Есть, и на
то существует несколько оснований,
исходящих из различных точек зрения:
- За 40 лет язык претерпел несколько модернизаций, последние действующие стандарты (C89, C99) вносят ряд существенных нововведений (самый яркий пример чему — комплексная арифметика), не отображаемых в "классической" литературе по C, которая писалась, как правило, много лет назад.
- Язык C изначально разрабатывался как язык системного программирования систем принадлежащих к классу UNIX. С широким распространением операционной системы Linux, основным "полигоном" использования C стали проекты GNU и другие свободные проекты для этой системы. Они все рассчитаны на использование компилятора GCC, который имеет ряд собственных расширений языка.
- Поддержка символьных представлений UNICODE, и способ кодирования UTF-8 для них, которая стала единственной поддерживаемой по умолчанию всеми дистрибутивами Linux. Поддержка широких символов (описана в <wchar.h>) слабо освещена в литературе, потому, что для англоязычных авторов она не есть особенно актуальной, а русскоязычные авторы во многом обходят эту часть языка стороной.
- Помимо компилятора GCC, в последние годы начинает широко практиковаться использование компилятора Clang (из проекта LLVM — Low Level Virtual Machine), ряд расширений GCC поддерживается Clang, другие — нет.
- Есть вещи, которые не являются, собственно, частью самого языка, но есть традицией, сложившейся в практике использования этой языковой среды. Примером этого является, например, использование в ядре Linux циклических двунаправленных списков везде где нужны списочные структуры (вместо односвязных списков, линейных списков и др.), что и будет рассмотрено далее.
- на Google:
Это текст (в формате OpenOffice), и архив примеров к нему.
- на Yandex:
текст и архив примеров
P.S. Варианты на Google и Yandex могут отличаться - они обновляются не синхронно, в разное время. Но эти отличия не могут быть существенными.