Константы и указатели

Последнее обновление: 23.02.2023

Указатели на константы

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