簡體   English   中英

為什么不能在之后設置 const 指針?

[英]Why can't a const pointer be set afterwards?

我知道這可能是一個微不足道的問題。 無法在聲明后設置 const 指針背后的邏輯是什么? 分配內存不會改變 const 所指的起始地址。 那為什么這不能...

int* const p;
p = new int [10];

...完成...這也禁止將const指針傳遞給函數?

這就是const的全部目的。

const代表“常量”,表示不能分配對象。

如果您希望指針成為變量,請不要將其設為const

我懷疑您期望您的分配被允許,因為這是對該對象的第一次分配。 你錯了! 這是您目前未使用的初始化的目的。

我猜你想寫:

int* const p = new int[10];

但我擔心你在這里有更根本的誤解。 例如:

好像分配內存不會改變起始地址

是的,絕對,完全會。

當您的p存在時,它具有未指定的值。 它的值不是您可以使用的“起始地址”。

然后你分配給它(盡管你應該已經初始化了)。 它的值等於new返回的指針。 該指針與代碼中之前的任何內容都沒有關系。

分配內存確實會改變地址。 例如,如果我們有

int * foo;
foo = new int[bar];

foo未初始化並且具有垃圾值。 然后foo = new int[bar]; foo分配一個新地址,該地址是bar int s 塊的開始。

現在當你有

int* const p;

指針是const所以我們不能在它初始化后改變它。

精簡版

您定義指針的方式意味着它本身是const ,因此您不能重新分配它,您實際上必須將它連同它的聲明一起分配

這里有更多關於const關鍵字的細節,即使它不是專門針對指針的使用。

請注意,以下代碼不應該編譯,因為您沒有為 const 指針p賦值:

int main() {
    int * const p;
}

對於以下情況也是如此:

int main() {
    int const i;
}

它不取決於您正在處理指針的事實,而是const關鍵字實際如何工作以及應該/可以使用的方式。


關於常量和指針的更多細節

無論如何,我沒有看到你的整個代碼,在我看來你的意圖不是有一個 const 指針,而是在你的情況下它可以幫助擁有一個指向 const 的指針(但這主要取決於你的問題,所以我可以是錯的)。 當然,如何定義它們取決於您的目的。

您可以將其定義為const 指針或指向const 值的指針,兩者的含義略有不同(當然,您也可以將指針定義為指向const 值的const 指針,這是一個很容易推導出的結果)上面提到的其他人)。

第一個表示指針本身不能重新分配,因此您必須在聲明期間分配它,僅此而已。 第二個改為定義一個可重新分配的指針,但您只能為其分配給定類型的 const 變量的地址(或者更好,即使它們被定義為非 const,當通過該指針訪問時,它們也將被視為 const,與案例的所有限制)。

下面是上面提到的const指針和const指針類型的簡單例子:

int main() {
    int i;
    // pointer to const int
    int const *icp;
    // const pointer to int
    int * const cip = &i;
    // const pointer to const int
    int const * const cicp = &i;
    // this one can be reassigned, of course
    icp = &i;
}

還要注意int constconst int是可以互換的,所以下面的聲明是等價的:

int const *p;
const int *p;

顯然,這不是一個詳盡的清單。 我只是試圖向您提供有關在定義指針時如何使用const關鍵字以及這些聲明的預期方法的更多詳細信息。

int* const p;

聲明p是一個不能改變的指針,即一旦它被初始化就不能改變它指向的位置。 但是,您可以更改它指向的值,因為它指向的對象類型是int

int* const p = new int [10];
p = new int[20]; // Not OK
p[0] = 100;      // OK

對比一下

int const* p = new int [10];
p = new int[20]; // OK. You can change where the pointer points to.
p[0] = 100;      // Not OK. You cannot change the value of what p points to.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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