Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прогр.группа2.docx
Скачиваний:
3
Добавлен:
15.09.2019
Размер:
46.46 Кб
Скачать

45. Указатели и массивы. Массивы указателей.

Указатель – это объект, содержащий адрес другого объекта и позволяющий косвенно

манипулировать этим объектом. Обычно указатели используются для работы с

динамически созданными объектами, для построения связанных структур данных, таких,

как связанные списки и иерархические деревья, и для передачи в функции больших

объектов – массивов и объектов классов – в качестве параметров.

Каждый указатель ассоциируется с некоторым типом данных, причем их внутреннее

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

типа указатель, и диапазон значений у них одинаков5. Разница состоит в том, как

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

одно и то же значение, но область памяти, где размещаются соответствующие типы,

может быть различной:

• указатель на int, содержащий значение адреса 1000, направлен на область

памяти 1000-1003 (в 32-битной системе);

• указатель на double, содержащий значение адреса 1000, направлен на область

памяти 1000-1007 (в 32-битной системе).

Когда мы применяем операцию взятия адреса (&) к объекту типа int, то получаем

результат типа int*

В языке СИ между указателями и массивами существует тесная связь. Например, когда объявляется массив в виде int array[25], то этим определяется не только выделение памяти для двадцати пяти элементов массива, но и для указателя с именем array, значение которого равно адресу первого по счету (нулевого) элемента массива, т.е. сам массив остается безымянным, а доступ к элементам массива осуществляется через указатель с именем array. С точки зрения синтаксиса языка указатель arrey является константой, значение которой можно использовать в выражениях, но изменить это значение нельзя.

Указатели на многомерные массивы в языке СИ - это массивы массивов, т.е. такие массивы, элементами которых являются массивы. При объявлении таких массивов в памяти компьютера создается несколько различных объектов. Например при выполнении объявления двумерного массива int arr2[4][3] в памяти выделяется участок для хранения значения переменной arr, которая является указателем на массив из четырех указателей. Для этого массива из четырех указателей тоже выделяется память. Каждый из этих четырех указателей содержит адрес массива из трех элементов типа int, и, следовательно, в памяти компьютера выделяется четыре участка для хранения четырех массивов чисел типа int, каждый из которых состоит из трех элементов.

Над указателями можно выполнять унарные операции: инкремент и декремент. При выполнении операций ++ и -- значение указателя увеличивается или уменьшается на длину типа, на который ссылается используемый указатель. В бинарных операциях сложения и вычитания могут участвовать указатель и величина типа int. При этом результатом операции будет указатель на исходный тип, а его значение будет на указанное число элементов больше или меньше исходного.

46. Стандартный (бесформатный) ввод-вывод.

Самый простой механизм ввода заключается в чтении по одному символу за раз из "стандартного ввода" (обычно с тер-

минала пользователя) с помощью функции getchar. Функция getchar() целого типа при каждом к ней обращении возвращает

следующий вводимый символ. В большинстве систем, которые поддерживают язык Си, терминал может быть заменен некоторым

файлом с помощью обозначения "<". Если некоторая программа prog использует функцию getchar, то командная строка

prog <infile

приведет к тому, что prog будет читать из файла infile, а не с терминала. Переключение ввода делается таким образом, что

сама программа prog не замечает изменения; в частности строка "<infile" не включается в командную строку аргументов

(см. следующую главу). Переключение ввода оказывается незаметным и в том случае, когда вывод поступает из другой прог-

раммы через межпроцессный канал. Например, командная строка

otherprog | prog

прогоняет две программы, otherprog и prog, так, что стандартным вводом для prog служит стандартный вывод other-

prog.

Функция getchar возвращает значение EOF, когда достигается конец файла, какой бы ввод она при этом не считывала.

Стандартная библиотека полагает символическую константу EOF равной -1 (посредством #define в файле stdio.h), но проверки

следует писать в терминах EOF, а не -1, чтобы избежать зависимости от конкретного значения.

Вывод можно осуществлять с помощью функции putchar(c), помещающей символ 'c' в "стандартный вывод", который по

умолчанию является терминалом. Вывод можно при вызове программы направить в некоторый файл с помощью обозначения ">".

Если prog использует putchar, то командная строка

prog > outfile

приведет к записи стандартного вывода в файл outfile, а не на терминал. В системе ДЕМОС можно также использовать межп-

роцессный канал.

В стандартной библиотеке ввода/вывода "функции" getchar и putchar на самом деле могут быть макросами. Это позволяет

избежать накладных расходов на обращение к функции для обработки каждого символа.