#include<stdio.h>
int main() {
int a[10] = {1, 2, 3, 4};
const int *pa = a;
*(pa 2) = 4; // error
char b[4] = "abc";
const char *pb = b;
*(pb 2) = 'c'; // error
int c = 10;
const int *pc = &c;
*(pc 2) = 4; // error
}
根據我的理解,const int/char *唯一的限制是我們不能修改它指向的值。但是,似乎修改*(pa 2)也會導致錯誤。為什么會這樣?
uj5u.com熱心網友回復:
因為 ispa 2與pa. 要么你想阻止陣列被修改,要么你不想,所以結果與原始指標具有相同的型別是有意義的。
uj5u.com熱心網友回復:
首先,請注意,這const主要是一種幫助程式員避免錯誤的輔助機制,而不是一種始終防止錯誤的強制機制。定義的資料const 可能會被放入只讀記憶體(C 實作允許這樣做,也允許不這樣做),然后嘗試修改該記憶體(無需通過請求作業系統來解決它更改記憶體保護)將產生段錯誤。否則,const主要是建議性的,而不是強制執行的。
說編譯器必須抱怨的具體規則*(pa 2) = 4;是在 C 2018 6.5.16 2 中,它討論了賦值運算子。此規則基于所涉及運算式的型別,而不是它們實際指向記憶體中的哪些物件。因為pa是指向 的指標const int,pa 2所以也是指向const int(C 2018 6.5.6 8:“當一個具有整數型別的運算式與一個指標相加或相減時,結果具有指標運算元的型別……”)。然后*(pa 2)是一個左值,指定pa 2指向的物件,左值的型別是const int(C 2018 6.5.3.2 4:“……如果運算元的型別為“指向型別的指標”,則結果的型別為“型別”……)。
于是*(pa 2) = 4;是指派型別的左值的嘗試const int。C 2018 6.5.16 2 說“賦值運算子應該有一個可修改的左值作為它的左運算元。” Aconst int不是可修改的型別,因此它不是可修改的左值。本段在約束部分中,這意味著編譯器需要針對違反它的情況發出診斷訊息。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/315667.html
上一篇:為什么下一個欄位顯式設定為空?
下一篇:在C中將char轉換為char*
