В c можно изменить const с помощью указателей, например:
//mainc.c
#include <stdio.h>
int main(int argc, char** argv) {
const int i = 5;
const int *cpi = &i;
printf(" 5:\n");
printf("%d\n", &i);
printf("%d\n", i);
printf("%d\n", cpi);
printf("%d\n", *cpi);
*((int*)cpi) = 8;
printf(" 8?:\n");
printf("%d\n", &i);
printf("%d\n", i);
printf("%d\n", cpi);
printf("%d\n", *cpi);
}
Константа изменяется, как видно на выходе:
Если мы попробуем то же самое в С++:
//main.cpp
#include <iostream>
using std::cout;
using std::endl;
int main(int argc, char** argv) {
const int i = 5;
const int *cpi = &i;
cout << " 5:" << '\n';
cout << &i << '\n';
cout << i << '\n';
cout << cpi << '\n';
cout << *cpi << '\n';
*((int*)cpi) = 8;
cout << " 8?:" << '\n';
cout << &i << '\n';
cout << i << '\n';
cout << cpi << '\n';
cout << *cpi << '\n';
int* addr = (int*)0x28ff24;
cout << *addr << '\n';
}
От выхода выглядит, что i
по-прежнему 5
и все еще находится в 0x28ff24
, поэтому константа не изменяется. Но в то же время cpi
также 0x28ff24
(то же, что и &i
), но значение, на которое он указывает, равно 8
(не 5
).
Может кто-нибудь объяснить, какая здесь магия?
Разъяснение здесь: qaru.site/info/335320/...