[英]C++, changing address pointer points to (to a const value)
我正在學習常量指針和值,但是我得到了賦值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;
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。 指針是否恆定是另一回事
ptr2
是指向int
的指針,而&x
產生對const int
的引用。 你的編譯器識別您正在嘗試一個指針到非設const
為const
的值。 由於這可能允許您更改const
值,因此這被視為錯誤。
如果這是可能的, 沒有什么能阻止你做*ptr2 = 7;
在下一行,它確實會修改一個const
對象。 更糟糕的是,沒有什么能阻止你將這樣的ptr2
傳遞給一個帶有int*
的函數,而這種函數無法知道它指向一個const int
。
ptr2是一個指向int的指針。 嚴格來說,它是指向可以更改的整數的指針。 另一方面,x是可以不改變的整數。 如果允許ptr2指向x,則允許您通過ptr2更改x:
*ptr2 = 77; //ok, since ptr2 points to a changeable int.
因此,ptr2可能無法重定向到其他地方,這不是問題。 只是它可能不會被重定向到指向與它所指向的類型不兼容的東西。
表達式&x
的類型是const int*
,你不能將它賦給int*
類型的東西(比如ptr2)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.