我有这段代码
int main()
{
char A = 'E';
const char * i;
i = &A;
A = 'B';
}
实际上是用MSVC编译的,为什么? 是不是const char *应该指向一个常量字符变量?为什么我可以在最后一行将A改为'B'?
我错过了什么吗?
答案 0 :(得分:7)
const char*
仅阻止您通过该指针修改指向变量的。它不会,实际上也不能阻止你通过其他方式修改它。 const
指针和引用如果只能指向或引用const
值,则没用。
答案 1 :(得分:7)
指向的char
类型的常量(a.k.a. pointee )与类型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
这是来自“C ++编程语言”的第5.4.1节,Stroustrup。
您可以在最后一行将A
更改为'B'
,因为A
的类型为char
,因此可以更改。它未被声明为const char
,这会阻止您这样做。
答案 2 :(得分:4)
const char*
意味着你不能修改指针到这个指针。这并不意味着其他人无法做到这一点。