我正在学习常量指针和值,但是我遇到了分配 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;
答案 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
的引用。您的编译器会识别您正在尝试将指针设置为非const
到const
值。由于这可能允许您更改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)。