Язык программирования C. Структура простейшей программы на языке C, страница 7

Структура может содержать внутри себя определение элемента типа другой структуры. Количество вложений не ограничено.

1.7.  Ввод и вывод

Язык С не имеет встроенных операторов для ввода – вывода данных. Стандарт языка определяет набор функций, обязательный для любой реализации. Эти функции обеспечивают ввод-вывод данных.

Мы рассмотрим этот раздел более подробно при рассмотрении библиотеки стандартных функций языка С.

Чем С отличаетс от других языков

В первую очередь тем, что имеет большое количество низкоуровневых конструкций программирования. Во многом эти отличия появились потому что язык создавался программистами и для программистов. Поскольку его создатель был профессиональным системным программистом, то естественно, что в первую очередь он пытался решить свои профессиональные проблемы. Язык С изначально не был коммерческим языком, и Керниган больше думал о своем удобстве, чем об удобстве будущих покупателей и пользователей языка.

Эти отличия являются одновременно и сильной и сдабой стороной языка. Сильной – потому что они позволяют пользователю достичь таких глубин в использовании компьютера, каких трудно достичь используя любой другой язык (за исключением, может быть, ассемблера). Слабой – потому что язык предполагает глубокие знания в архитектуре и неквалифицированный пользователь неумело используя мощь языка может легко нарушить нормальное функционирование системы.

Побитовые операции

Мощьное средство работы с битами. Можно сбросить в переменной все биты, не соответствующие заданной маске:

value = value &0x00FF;

Можно «установить» любой из битов в единицу

value = value | 0x0100;

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

Адресные операции

Язык С поддерживает две специальные операции – определения адреса некоторой переменной и взятия значения, лежащего по некоторому адресу ОП.

Наличие этих операций позволило включить в систему типов языка С новый тип – указатель, Это переменная, в которой может храниться адрес другой переменной.

Тем, кто никогда не сталкивался с ассемблером, а свое знакомство с программированием начал с Pascal’я или BASIC’а, может показаться излишним работа с указателями на переменные. Но если потратишь усилия на понимание косвенной адресации в ассемблере, то поймешь, почему Керниган включил эти операции в язык С.

Но это, наверное, не главное. Главное – это то, что использование указателей позволило решить проблему динамического распределения памяти. Основная масса языков программирования не позволяет динамически (то есть на этапе выполнения программы) распределять и перераспределять память по переменные. Это означало, что еще до выполнения программы, то есть фактически при разработке программы, вы должны указать рамер каждого массива. Мало того, что это не очень то удобно, но зачастую вы и не знаете, какого размера массив может вам понадобиться. Часто это определяется только во время выполнения программы. Поэтому приходилось резервировать массивы под максимальный размер, который может потребоваться лишь однажды. Наличие указателей позволяет распределять память и получать к ней доступ во время выполнения программы. Библиотека стандартных функций языка С включает для этого ряд функций:

malloc()

calloc()

free() и т.п.