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