const char* вопрос

Если для const int* нельзя присвоить литерал, а также изменить уже присвоенное значение l-value (логично),то почему для const char* можно присвоить литерал, да еще и изменить в последствии значение? Хотя пишут, что меняется не значение, а переназначается указатель, в таком случае мы цепляем наш указатель к загаданной строке "example" из всей Вселенной? Тогда почему адрес выводится один и тот же на выходе?

#include <iostream>
int main()
{
    int value1{5};
    int value2{6};
    int* value3=&value1;
    std::cout<<"&value3="<<value3<<'\n';
    std::cout<<"\t&value1="<<&value1<<'\n';
    value3=&value2;
    std::cout<<"&value3="<<value3<<'\n';
    const char* a{"stroka1"};
    a="abcd";
    std::cout<<"&a="<<&a<<'\n';
    a="efg";
    std::cout<<"&a="<<&a<<'\n';
    std::cout<<a;
    return 0;
}

Ответы (1 шт):

Автор решения: AlexGlebe

Константность определяет тип на что указывает переменная, а не само его значение (указатель). Примеры объявления константности :

// указатель на константные буквы
const char * a {"stroka1"};

// то же самое
char const * a {"stroka2"};

// a - константный указатель на буквы,
// которые можно менять, но сам указатель - нет
char s [ ] = "stroka3" ;
char * const a = s ;

// константный указатель на константные буквы
char const * const a {"stroka4"};

Теперь адрес & a - выдаёт адрес, где хранится значение переменной, а не само его значение.

char const * a {"stroka"};

// a - имеет тип указателя на буквы
//  char const *

// & a - это адрес указателя на переменную которая тоже указатель
//  char const * *

С типом int * - то же самое.

// переменная целочисленного типа
int i ;

// адрес переменной i
int * pi = & i ;

// & i - адрес переменной целого числа с типом
//  int *

// & pi - адрес переменной с типом указателя на указатель, имеющее тип
//  int * *
→ Ссылка