簡體   English   中英

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

[英]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的引用。 你的編譯器識別您正在嘗試一個指針到非設constconst的值。 由於這可能允許您更改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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM