
- •10.3 Операторы управления
- •10. 4 Оператор мультиветвления switch
- •10.6 Применение функции printf для форматирования
- •11.1 Графические программы
- •11.2 Построение символьного графика
- •11.4 Построение графика в графическом режиме
- •12.1 Передача данных для построения графика в MathCad
- •12.4 Указатели
- •12.5 Описание указателей
- •12.6 Указатели для массивов и строк
- •13.3 Оператор динамического выделения памяти new
- •Void main ( ) {
- •Void tab( ); };
- •Void main ( ) {
- •15.1 Класс объектов, элементы класса
- •15.2 Доступ к элементам класса
- •15.3 Вызов элементов класса
- •15.4 Конструкторы классa
- •15.5 Пример класса Tkplk
- •16.1 Наследование
- •16.2 Полиморфизм
- •16.3 О перегрузке функций и операций
- •17. 1 Среда программирования и библиотека vcl
- •17.2 Консольное приложение в Builder
- •При выполнении лабораторных работ в дисплейном классе используется
- •17.5 Вид экрана в builder
- •17.6 Работа с проектом в системе Builder
- •18.1 Редактор кода
- •18.4 Пример запроса, ввода, вывода для Win -программы
12.4 Указатели
Указатель - это символическое представление адреса, т.е. указатель является
адресной переменной.
Следовательно, указатель - это адрес.
В предшествующих лекциях имели дело с тремя атрибутами каждой переменной:
с именем, типом и значением. В С++ и в Си добавляется четвертый атрибут –
указатель, соответствующий адресу переменной в ОП, что показано на рис. 12.3.
Переменная
Имя
Тип Значение
Указатель
a char Я p = 0064fe00
b float 5. yq = 0064fe01
адрес в ОП
Рис. 12.3 Атрибуты переменных в С++
В соответствии с рис.12.3, если вывести значения переменных p, yq, то получим,
например, p = 0064fe00, yq = 0064fe01.
Присвоить значение указателю можно обычным оператором присваивания,
например,
p = &a; yq = &b;
но есть и другие способы.
Указатели описываются и обрабатываются особым образом.
12.5 Описание указателей
Если в любых операторах описания типа переменных видим
звездочку * перед именем, то это имя является переменной типа указатель.
Тип перед * - это тип переменной, на которую указывает указатель.
Например, оператор
float * yq ; (12.7)
следует читать следующим образом: "игрек-ку" указывает на вещественную переменную.
Звездочка может стоять в любом месте между типом и именем, но рекомендуется ставить её рядом с типом, т.к. обычный тип со звездочкой можно рассматривать как новый тип - указатель на объект определённого типа.
Например, (12.7) можно записать как float* yq ;
и читать так: yq - это указатель на переменную типа float.
Возможны и другие варианты чтения (12.7):
содержимое по адресу yq есть float или "по адресу yq живет float". Так как
операция * , применённая к адресу, даёт значение, то (12.7) можно записать как
float *yq ;
и понимать следующим образом: значение ( *yq ) имеет тип float.
Имя переменной, с которой связан указатель, появляется после присваивания
указателю её адреса: yq = &b; или float* yq = &b; .
С++ разрешает различные операции с адресными переменными, но
эти операции с адресами выполняются по специальным правилам. Например,
вычислим значение (yq +1) для (12.7), см. также рис. 12.3. Если его
вывести на экран, то получим значение 0064FE05, а не 0064FE02 , как при обычном
сложении. Для указателей операция +1 означает адрес следующей переменной.
Рассмотрим простую аналогию обычного применения указателей.
Я могу сказать, что студент Иванов сейчас невнимателен, а могу указать на него,
и сказать : "Вы сейчас невнимательны" , не называя его имени. Другой пример.
Пусть на столе много предметов и, в том числе чья-то газета. Я могу попросить
убрать газету, а могу показать на неё пальцем и попросить:
"Пожалуйста, уберите это." В обоих примерах второй способ соответствует
указателям, т.к. имя самого объекта не используется.
Фрагмент программы с указателем
. . . . . .
float stpnd = 350.5; float doxod, *adr; //2003 г. - 350.5
adr = &stpnd; doxod = *adr; (12.8)
cout << doxod <<" - это мало!\n" << endl; // . . . . . .
В результате получим на экране: 350.50 - это мало!