Указатели могут указывать как на переменные, так и на константы. Чтобы определить указатель на константу, он тоже должен объявляться с ключевым словом const:
#include <iostream> int main() { const int a {10}; const int *pa {&a}; std::cout << "address=" << pa << "\tvalue=" << *pa << std::endl; }
Здесь указатель pa
указывает на константу a
. Поэтому даже если мы захотим изменить значение по адресу, который хранится в указателе,
мы не сможем это сделать, например так:
*pa = 34;
В этом случае мы просто получим ошибку во время компиляции.
Возможна также ситуация, когда указатель на константу на самом деле указывает на переменную:
#include <iostream> int main() { int a {10}; const int *pa {&a}; std::cout <<"value=" << *pa << std::endl; // value=10 a = 22; std::cout <<"value=" << *pa << std::endl; // value=22 //*pa = 34; // так делать нельзя }
В этом случае переменную отдельно мы сможем изменять, однако по прежнему изменить ее значение через указатель мы не сможем.
Через указатель на константу мы не можем изменять значение переменной/константы. Но мы можем присвоить указателю адрес любой другой переменной или константы:
const int a {10}; const int *pa {&a}; // указатель указывает на константу a const int b {45}; pa = &b; // указатель указывает на константу b std::cout <<"*pa = " << *pa << std::endl; // *pa = 45 std::cout <<"a = " << a << std::endl; // a = 10 - константа a не изменяется
От указателей на константы надо отличать константные указатели. Они не могут изменять адрес, который в них хранится, но могут изменять значение по этому адресу.
#include <iostream> int main() { int a {10}; int *const pa {&a}; std::cout << "value=" << *pa << std::endl; // value = 10 *pa = 22; // меняем значение std::cout << "value=" << *pa << std::endl; // value = 22 int b {45}; // pa = &b; так нельзя сделать }
И объединение обоих предыдущих случаев - константный указатель на константу, который не позволяет менять ни хранимый в нем адрес, ни значение по этому адресу:
int main() { int a {10}; const int *const pa {&a}; //*pa = 22; так сделать нельзя int b {45}; // pa = &b; так сделать нельзя }