下面的代碼:const的指針指向const int的強制轉換爲const指針指向int的指針
int *const *a = nullptr;
int const *const *b = nullptr;
b = a;
爲什麼這個代碼編譯和運行沒有錯誤?不是const指針意味着我們不能改變它?
下面的代碼:const的指針指向const int的強制轉換爲const指針指向int的指針
int *const *a = nullptr;
int const *const *b = nullptr;
b = a;
爲什麼這個代碼編譯和運行沒有錯誤?不是const指針意味着我們不能改變它?
其實在我的想法中有一個錯誤:我認爲b
是const
,所以無法分配到。但b
是可修改的(雖然它指向的是const
),所以可以將其分配給b
。
換句話說,int const *const *b
不是const
指針,但實際上是指向const
指針的指針,所以可以更改它。
@TobySpeight這不是一個答案嗎? OP不明白髮生了什麼事情(因爲它似乎違反了const的正確性)。這回答了這個問題(沒有違反const正確性)。 – Yakk
@Yakk我應該更仔細地閱讀答案。你是對的。我認爲混淆是關於類型兼容性的;我並沒有想到混淆是用'int * const * const'。我已經撤回了我的批評。 –
b
是一個指向const int指針的指針。可以將它指定爲指向(可寫)int的常量指針,因爲如果您要解除引用*b
,那麼您將能夠通讀它。
另一方面,a=b
將無法編譯,因爲這將使指向(可寫)int指向const int,從而能夠寫入你不應該的東西。類型系統阻止了這一點。
int const **c;
int **d;
練習:什麼分配是一個B之間,允許,C & d
,當你考慮它也變得更有趣嗎?爲什麼?
'a = a' - 是** ok **,將指針指向另一個指針,它們都指向相同的類型。 'a = b' - _fail_(你已經解釋了) 'a = c' - _fail_。我們還創建了一個指向int int的可寫int指針。 'a = d'; - 似乎**好**。我們把它分配給指向'int *'的最後一個指針後面的所有內容,這似乎是正確的。 (你已經描述過) 'b = b' - ** ok **。一種類型的指針指向相同類型的指針。 'b = c' - ** ok **。一個const類型指向另一個可寫類型的指針。我們仍然可以閱讀。 'b = d' - ** ok **。與上面的一樣。 繼續另一條評論。 – Utikeev
'c = a' - _fail_。我們賦值'c'來指向int的指針,所以我們可以改變const。壞。 'c = b' - _fail_。我們賦值'c'指向非const指針,它可以被改變(?不確定這個)。 'c = c' - ** ok **。一種類型的指針指向相同類型的指針。 'c = d' - _fail_(?)。絕對不確定這一點。它是否與通過'd'更改'int const'有關? 'd = a' - _fail_。我們可以改變指針,這是指向和const。 'd = b' - _fail_。和上面的例子一樣。 'd = c' - _fail_(?)。理解上的問題與'c = d'相同。不知道。 'd = d' - ** ok **。很明顯, – Utikeev
這其實很容易搞砸這件事,我有很多問題試圖理解指針,並沒有看到任何獨特的規則,可以幫助排序一切:( – Utikeev
您使用哪種語言? – Brino
我使用C++語言,標準C++ - 11 – Utikeev