Допускается объявление указателей в виде:
const СпецификаторТипа *ИмяУказателя;
СпецификаторТипа *const ИмяУказателя=&ИмяПеременной;
В первом случае не допускается изменять значение переменной через указатель.
Пример:
int a,b;
const int *pa;
pa=&a; // допустимо
a=5; //допустимо
*pa=6; // недопустимо
Во втором случае инициализация обязательна, т.к. адрес, хранимый в переменной ИмяУказателя изменить нельзя, а значение переменной ИмяПеременной через указатель изменить можно.
Пример:
int a,b;
int* const pa=&a;
pa=&b; // недопустимо
a=5; //допустимо
*pa=6; // допустимо
Ссылки
Ссылка также как и указатель хранит адрес некоторого объекта.
Форма записи:
Спецификатор-типа & описатель=ИмяПеременной
Имя переменной должно существовать.
Отличие ссылки от указателя: однажды присвоенное ссылке значение не может быть изменено, т.е. ссылка будет связана только с той ячейкой, адрес которой был присвоен ссылке при инициализации. Значение адреса, хранимого указателем, может быть изменено. Значение переменной, на которую указывает ссылка или указатель можно изменять. Операция взятия адреса допустима к ссылке, а операция разыменования – нет, т.к. для получения содержимого ячейки достаточно обратиться к ссылке по ее имени. Из вышесказанного можно сделать вывод, что ссылка грубо говоря - это указатель с константным значением адреса.
|
|
Пример:
#include<iostream.h>
void main()
{
int a=2,b=5;
int &p_a=a;
p_a++; // аналогично a++
cout<<p_a<<endl;
p_a=b; // аналогично a=b
cout<<p_a;
cout<<&p_a; //вывод адреса
}