我有这个代码
int main()
{
char A = 'E';
const char * i;
i = &A;
A = 'B';
}
它实际上是用 MSVC 编译的,为什么?const char * 不应该指向一个常量字符变量吗?为什么我可以在最后一行将 A 更改为“B”?
我错过了什么吗?
char
指向的类型常量(也称为指针)和类型的常量指针之间存在差异char*
。如果要保护指针免受(意外)修改,可以将其声明为常量:
char* p = '...';
char* const cp = 'Hello, World!'; // a constant pointer
cp[1] = ','; // okay, the pointee is not constant
cp = p; // error, the pointer is constant
指向常量的变量指针可以改变:
char *p = '...';
const char* pc = 'Hello, World!'; // pointer to a constant
pc[1] = ','; // error, the pointee is constant
pc = p; // okay
最后,您可以声明一个指向常量的常量指针
const char* const cpc = 'Hello, World!';
cpc[1] = 'a'; // error, pointee cannot change
cpc = p; // error, pointer cannot change
这是来自 Stroustrup 的“C++ 编程语言”的第 5.4.1 节。
您可以在最后一行更改A
为,因为是类型,因此可以更改。它没有被声明为 a ,这会阻止你这样做。'B'
A
char
const char
Aconst char*
仅阻止您通过该指针修改指向的变量。它不会,实际上也永远不能阻止你通过其他方式修改它。const
如果指针和引用只能指向或引用const
值,那么它们将毫无用处。
const char*
意味着你不能通过这个指针修改指针。这并不意味着其他人将无法做到这一点。