Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BOOK_С_INTUIT.docx
Скачиваний:
31
Добавлен:
11.02.2015
Размер:
6.34 Mб
Скачать

Контрольные вопросы

  1. Каково общее назначение указателей в языке С?

  2. Какие арифметические операции допускаются для указателей?

  3. Какие унарные операторы используются с указателями? Как они называются?

  4. Для каких типов данных может быть использован указатель?

  5. Как числовые значения указателей изменяются при их инкрементировании в зависимости от типов данных.

  6. С помощью какого формата осуществляется вывод на консоль адресов переменных заданного типа?

  7. Что такое многоуровневая адресация? Как она организуется в языке С?

  8. Как осуществляется инициализация указателей на вещественные типы данных?

  9. Как осуществляется инициализация указателей на символьный тип данных?

  10. Какой смысл имеет значение указателя NULL?

  11. Что произойдет, если применить к указателю со значением NULLоперацию разыменования?

  12. Как следует определять и инициализировать указатель на константу?

  13. Как следует определять и инициализировать константный указатель?

  14. В чем отличие константного указателя от указателя на константу?

Библиографический список

  1. Керниган Б. У. Язык программирования С : пер. с англ./Б. У.Керниган, Д. М.Ритчи. – 2-е изд. – М.: Вильямс, 2007. – 304 с.

  2. Кочан С. Программирование на языке С : пер. с англ./С. Кочан. – 3-е изд.– М.: Вильямс, 2007. – 496 с.

  3. Подбельский В.В. Программирование на языке Си: учеб. пособие/ В.В.Подбельский, С.С.Фомин. – 2-е изд., доп. – М.: Финансы и статистика, 2007. – 600 с.

  4. Шилдт Г. Полный справочник по С : пер. с англ./Г. Шилдт. – 4-е изд. – М.: Вильямс, 2007. – 704 с.

  5. Подбельский В.В. Практикум по программированию на языке Си: учеб. пособие/В.В.Подбельский. – М. : Финансы и статистика, 2004. – 576 с.

  6. Horton Ivor. Beginning C : From Novice to Professional / Ivor Horton. – 4-th ed. – N. Y. : Apress, 2006. – 640 p.

Тема 8 Указатели и массивы в языке с

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

ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

Одной из наиболее распространенных конструкций с использованием указателей являются массивы [1]. Результатом применения указателей для массивов является меньшее количество используемой памяти и высокая производительность [1].

В языке Смассивы – это упорядоченные данные (элементы) одного типа. Компилятор языкаСрассматривает имя массива как адрес его первого элемента. Например, если имя массиваArrс десятью элементами, то компилятор преобразуетi-й элемент (0i< 10) по правилам работы с указателями с операцией разыменования:*(Arr + i). ЗдесьArrкак бы указатель, аi– целочисленная переменная. Сумма(Arr + i) указывает наi-й элемент массива, а операция разыменования (оператор раскрытия ссылки*) дает его значение.

Имя массива без индекса образует указатель на начало этого массива.

Следует помнить следующее: отличие имени массива от указателя состоит в том, что имя массива не может быть изменено. Оно всегда указывает на одно и то же место в памяти – на нулевой элемент.

Пусть, например, массив Arr содержит 10 целочисленных переменных:

int Arr[10];

Тогда можно объявить указатель ptr, который будет указывать на элементы массиваArr:

int *ptr;

Тип указателя (в примере это int) должен соответствовать типу объявленного массива.

Для того чтобы указатель ptrссылался на первый элемент (с нулевым индексом) массиваArr, можно использовать утверждение

ptr = Arr;

В то же время можно применить прямую адресацию:

ptr = &Arr[0];

Обе формы записи эквивалентны.

Аналогичные утверждения будут справедливы для других типов массивов: char,float,doubleи пр.

Если указатель ptrуказывал на первый элемент (с нулевым индексом) массиваArr, то для обращения к следующему элементу массива допустимы такие формы утверждений:

ptr = &Arr[1];

ptr += 1;

Соответственно выражение *(ptr+1) будет ссылаться на значение, содержащееся в элементеArr[1].

Утверждение

ptr += n;

заставит указатель *ptr ссылаться на элемент массива, находящийся на расстоянииn от того, на который ранее ссылался указатель, независимо от типа элементов, содержащихся в массиве [1]. Разумеется, значениеn должно быть в допустимых пределах для данного объема массива.

При работе с указателями и массивами особенно удобны операторы инкремента «++» и декремента «––». Использование оператора инкремента с указателем аналогично операции суммирования с единицей, а операция декремента имеет тот же эффект, что и вычитание единицы из указателя.

В языке программирования Свполне корректной операцией является сравнение указателей. К указателям применяются операции сравнения>,>=,!=,==,<=,<[3]. Сравнивать указатели допустимо только с другими указателями того же типа или с константойNULL, обозначающей значение условного нулевого адреса. КонстантаNULL– это особое значение переменной-указателя, присваиваемое ей в том случае, когда она не должна иметь никакого значения. Его можно присвоить переменной-указателю любого типа. Оно представляет собой целое число нуль.

Особое значение имеет сравнение двух указателей, которые связаны с одним и тем же массивом данных.

Рассмотрим инициализацию указателей типа char:

char *ptr = "hello, world";

Переменная *ptrявляется указателем, а не массивом. Поэтому строковая константа"hello, world"не может храниться в нем. Тогда возникает вопрос, где она хранится. Для этого следует знать, что происходит, когда компилятор встречает строковую константу. Он создает так называемуютаблицу строк, где сохраняет строковые константы, которые попадаются ему по ходу чтения текста программы [4]. Следовательно, когда встречается объявление с инициализацией, то компилятор сохраняет"hello, world" в таблице строк, а указатель*ptrзаписывает ее адрес.

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

Массив указателей фиксированных размеров вводится одним из следующих определений [4]:

тип *имя_массива [размер];

тип *имя_массива [ ] = инициализатор;

тип *имя_массива [размер] = инициализатор;

В данной инструкции типможет быть как одним из базовых типов, так и производным;имя_массива– идентификатор, определяемый пользователем по правилам языкаС;размер– константное выражение, вычисляемое в процессе трансляции программы;инициализатор– список в фигурных скобках значений элементов заданного типа (т.е.тип).

Рассмотрим примеры:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]