Доброго времени суток.
В Си с помощью указателя я могу изменить значение константы.
const int a = 5;
int *p = &a;
*p = 10;
printf("%d", a);
Вывод:10
В Си++ компилятором допускается следующий код:
const int a = 5;
int *p = (int *) &a;
*p = 10;
std::cout << *p << " " << a;
Вывод:10 5
Значение по адресу указателя p изменилось, в то время как сама a - нет? Как это работает?
Ни в С, ни в С++ никаким способами не разрешается изменять значение константного объекта. Любые попытки такого изменения приводят к неопределенному поведению. Именно неопределенное поведение вы и наблюдаете в обоих своих примерах.
Язык С
6.7.3 Type qualifiers
6 If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined.
Язык С++
9.1.7.1 The cv-qualifiers
4 Except that any class member declared mutable can be modified, any attempt to modify a const object during its lifetime results in undefined behavior.
В Си с помощью указателя я могу изменить значение константы.
Нет, конечно. Такая инициализация указателя не допускается ни в С, ни в С++
const int a = 5;
int *p = &a;
Неявного преобразования const int * к int * в этих языках нет. Такое преобразование можно сделать только явно. Но и явное преобразование не поможет вам "изменить константу".
Как это работает?
Никак не работает. Неопределенное поведение.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости