
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 - это мало!