Указатели могут указывать как на переменные, так и на константы. Чтобы определить указатель на константу, он тоже должен объявляться с ключевым словом 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; так сделать нельзя
}