Решил я рассмотреть константный указатель, так как видел на форумах много вопросов по этой теме. Ну что ж, начнем наш урок)
Ключевое слово const вместе с указателями может использоваться в трех случаях:
— мы хотим объявить указатель на константу;
— мы хотим объявить константный указатель;
— мы хотим объявить константный указатель на константу. Итак, рассмотрим по порядку.
Указатель на константу.
const int *ptr;
Так оператор разыменования можно ставить рядом с переменной, с типом или вообще посередине, я решил поставить рядом с переменной ptr для наглядности и теперь эта запись означает следующее: ptr является указателем, который ссылается на const int. Теперь для нашего примера мы создадим переменную t и затем ее адрес запишем в указатель ptr.
const int *ptr; int t = 999; ptr = &t;
Теперь, если мы попытаемся изменить косвенно значение переменной t, получим ошибку.
const int *ptr; int t = 999; ptr = &t; // *ptr = 777; Ошибка!!!
Также не изменится смысл, если const поставить справа от int.
int const *ptr2; ptr2 = &t; // *ptr2 = 777; Ошибка!!!
Мы не можем изменять значение переменной через указатель, но само значение указателя мы можем менять. То есть нашему указателю можем присвоить адрес другой переменной.
Константный указатель.
Теперь, если мы хотим запретить изменение значения указателя, мы должны записать в следующем виде.
int *const ptr3 = &t;
При создании указателя мы присваиваем адрес переменной, который не можем меняться в дальнейшем. Но значение самой переменной через указатель мы можем менять.
int *const ptr3 = &t; *ptr3 = 888; int t2 = 9876; //ptr3 = &t2; Ошибка!!!
И теперь рассмотрим третий вариант.
Константный указатель на константу.
В этом случае мы не можем менять ни значение переменной через указатель, ни значение самого указателя.
const int *const ptr4 = &t; //*ptr4 = 555; Ошибка!!! //ptr4 = &t2; Ошибка!!
И теперь полный код программы.
#include <iostream> using namespace std; void main() { //Указатель на константу const int *ptr; int t = 999; ptr = &t; // *ptr = 777; Ошибка!!! int const *ptr2; ptr2 = &t; // *ptr2 = 777; Ошибка!!! cout<<t<<endl; cout<<*ptr2<<endl; //Константный указатель int *const ptr3 = &t; *ptr3 = 888; cout<<t<<endl; int t2 = 9876; //ptr3 = &t2; Ошибка!!! //Константный указатель на константу const int *const ptr4 = &t; //*ptr4 = 555; Ошибка!!! //ptr4 = &t2; Ошибка!! }