[英]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 const
和const 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.