Программирование >>  Структурное программирование 

1 ... 107 108 109 [ 110 ] 111 112 113 ... 342


Резюме Терминология Типичные ошибки программирования Хороший стиль программирования Советы по повышению эффективности Замечания по мобильности Замечания по технике программирования Упражнения для самопроверки Ответы на упражнения для самопроверки Упражнения Специальный раздел: построение вашего собственного компьютера Дополнительные упражнения на указатели Упражнения на работу со строками Специальный раздел: упражнения повышенной сложности на работу со строками Головоломный проект работы со строками

5.1. Введение

в этой главе мы обсудим одно из наиболее мощных свойств языка программирования С-Ь-Ь - указатели. Указатели - одна из наиболее трудных для освоения возможностей С-Ь-Ь. В главе 3 мы видели, что для передачи параметров по ссылке можно использовать ссылки. Указатели предоставляют программам возможность моделировать передачу по ссылке и создавать и манипулировать динамическими структурами данных, т. е. структурами данных, которые могут нарастать и сокращаться, например, такими, как связные списки, очереди, стеки и деревья. В данной главе объясняются основные концепции указателей. Эта глава также углубляет наши представления о взаимосвязи между массивами, указателями и строками и включает тщательно подобранный набор упражнений на обработку строк.

План

5.1. Введение

5.2. Объявления и инициализация переменных указателей

5.3. Операции над указателями

5.4. Вызов функций по ссылке

5.5. Использование спецификатора const с указателями

5.6. Пузырьковая сортировка, использующая вызов по ссылке

5.7. Выражения и арифметические действия с указателями

5.8. Взаимосвязи между указателями и массивами

5.9. Массивы указателей

5.10. Учебный пример: моделирование тасования и раздачи карт

5.11. Указатели на функции

5.12. Введение в обработку символов и строк 5.12.1. Основы теории символов и строк

5.12.2.Функции работы со строками из библиотеки обработки строк

5.13. Размышления об объектах: взаимодействие объектов



В главе 6 исследуется использование указателей со структурами. Глава 15 знакомит с техникой управления динамической памятью и содержит примеры создания и использования динамических структур данных.

5.2. Объявления и инициализация переменных

указателей

Указатели - это переменные, которые содержат в качестве своих значений адреса памяти. С другой стороны, указатель содержит адрес переменной, которая содержит определенное значение. В этом смысле имя переменной отсылает к значению прямо, а указатель - косвенно (рис. 5.1). Ссылка на значение посредством указателя называется косвенной адресацией.

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

int *countPtr, count;

объявляет переменную countPtr типа int * (т.е. указатель на целое число) и читается как countPtr является указателем на целое число или countPtr указывает на объект типа int . Однако переменная count объявлена как целое число, но не как указатель на целое число. Символ * в объявлении относится только к countPtr. Каждая переменная, объявляемая как указатель, должна иметь перед собой знак звездочки (*). Например, объявление

float *xPtr, *yPtr;

указывает, что и xPtr и yPtr являются указателями на значения типа float. Использование * подобным образом в объявлении показывает, что переменная объявляется как указатель. Указатели можно объявлять, чтобы указывать на объекты любого типа данных.

Типичная ошибка программирования 5.1

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

Хороший стиль программирования 5.1

Хотя это и не обязательно, включайте буквы Ptr в имена переменных указателей, чтобы было ясно, что эти переменные являются указателями и требуют соответствующей обработки.

count

countPtr

count

countпрямо

ссылается на переменную со значением 7

count косвенно ссылается на переменную со значением 7

Рис. 5.1. Прямая и косвенная ссылки на переменную



Указатели должны инициализироваться либо при своем объявлении, либо с помощью оператора присваивания. Указатель может получить в качестве начального значения О, NULL или адрес. Указатель с начальными значениями О или NULL ни на что не указывает. NULL - это символическая константа, определенная в заголовочном файле (iostream.h и в нескольких заголовочных файлах стандартной библиотеки С). Задание NULL как начального значения эквивалентно заданию начального значения О, но в С-Ы-0 предпочтительнее. Если присваивается О, то он преобразуется в указатель соответствующего типа. Значение О - единственное целое значение, которое можно прямо присваивать как значение указателю без предварительного приведения целого числа к типу указателя. Присваивание адреса переменной указателю обсуждается в разделе 5.3.

Хороший стиль программирования 5.2

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

5.3. Операции над указателями

& или операция адресации, - унарная операция, которая возвращает адрес своего операнда. Например, если имеются объявления

int у = 5; int *yPtr;

ТО оператор

yPtr = &у;

присваивает адрес переменной у указателю yPtr. Говорят, что переменная yPtr указывает на у. Рисунок 5.2 показывает схематическое представление памяти после того, как выполнено указанное выше присваивание. На рисунке показана связь указателя с помощью стрелки от указателя к объекту, на который он указывает.

Рисунок 5.3 показывает представление указателя в памяти в предположении, что целая переменная у хранится в ячейке 600000, а переменная указатель yPtr хранится в ячейке 500000. Операнд операции адресации должен быть L-величиной (т.е. чем-то таким, чему можно присвоить значение так же, как переменной); операция адресации не может быть применена к константам, к выражениям, не дающим результат, на который можно сослаться, и к переменным, объявленным с классом памяти register.

Операция *, обычно называемая операцией косвенной адресации или операцией разыменования, возвращает значение объекта, на который указывает ее операнд (т.е. указатель). Например, (снова сошлемся на рис. 5.2) оператор

cout *yPtr endl;

печатает значение переменной у, а именно 5. Использование * указанным способом называется разыменованием указателя.

Типичная ошибка программирования 5.2

Разыменование указателя, который не был должным образом инициирован или которому не присвоено указание на конкретное место в памяти. Это может вызвать неисправимую ошибку выполнения или может неожиданно изменить важные данные и программа завершится неверными результатами.



1 ... 107 108 109 [ 110 ] 111 112 113 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика