1

我有这个代码

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

    const char * i;

    i = &A;

    A = 'B';

}

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

我错过了什么吗?

4

3 回答 3

8

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'Acharconst char

于 2012-11-14T11:55:20.627 回答
7

Aconst char*仅阻止您通过该指针修改指向的变量。它不会,实际上也永远不能阻止你通过其他方式修改它。const如果指针和引用只能指向或引用const值,那么它们将毫无用处。

于 2012-11-14T11:40:51.813 回答
4

const char*意味着你不能通过这个指针修改指针。这并不意味着其他人将无法做到这一点。

于 2012-11-14T11:41:15.737 回答