const char *允许更改字符值,为什么?

时间:2012-11-14 11:38:19

标签: c++ const

我有这段代码

int main()
{
    char A = 'E';

    const char * i;

    i = &A;

    A = 'B';

}

实际上是用MSVC编译的,为什么? 是不是const char *应该指向一个常量字符变量?为什么我可以在最后一行将A改为'B'?

我错过了什么吗?

3 个答案:

答案 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*意味着你不能修改指针这个指针。这并不意味着其他人无法做到这一点。