C ++,更改地址指针指向(到const值)

时间:2014-03-07 14:26:58

标签: c++ pointers const declaration

我正在学习常量指针和值,但是我遇到了分配 ptr2 =& x 的问题,错误C2440:'=':无法从'const int *'转换为'int * ”。为什么? ptr2不是常数所以我可以更改它所指向的地址,x是const但我不改变它的值。我很困惑。

const int x = 10;
int y = 20;
int * const ptr1 = &y; // const pointer must be initialized
int *ptr2 = &y;
cout << *ptr1 << endl;
*ptr1 = 5; // changes content of the address
cout << *ptr1 << endl;
ptr2 = &x; // changes address pointed to by ptr2,  not content of x!
cout << *ptr2 << endl;

4 个答案:

答案 0 :(得分:3)

const指针和const值之间存在差异:

int * px; // pointer to an int
int * const px2; // constant pointer to an int
int const * px3; // pointer to a constant int
int const * const px4; // constant pointer to a constant int.

您的指针只能指向相同的类型,或者至少指向限制较少的类型。

int x = 1;
int const y = 2;
int const * px = &x; // fine, as const is more restrictive
int * py = &y; // Wrong -> you'd lose the const

所以,如果你有一个const int,你的指针也必须是一个const int。指针是否恒定是另一个故事

答案 1 :(得分:0)

ptr2是指向int的指针,而&x则表示对const int的引用。您的编译器会识别您正在尝试将指针设置为非constconst值。由于这可能允许您更改const值,因此这被视为错误。

答案 2 :(得分:0)

如果可以, nothing 会阻止您在下一行执行*ptr2 = 7;,这确实会修改const对象。更糟糕的是,没有什么可以阻止你将这样的ptr2传递给一个int*的函数,而这个函数无法知道它指向const int

答案 3 :(得分:0)

ptr2是指向int的指针。严格来说,它是一个指针到一个可以改变的整数。另一方面,x是可能不会被更改的整数。如果允许ptr2指向x,则允许您通过ptr2更改x:

*ptr2 = 77; //ok, since ptr2 points to a changeable int.

因此,ptr2可能无法重定向到其他地方。只是它可能不会被重定向到指向与它指向的类型不兼容的东西。

表达式&x的类型为const int*,您无法将其分配给int*类型的内容(如ptr2)。