在我對今天我意識到的const
的理解中,您的答案非常想要清除這個主要空白。「const int * ptr =&i」是什麼意思?爲什麼它接受非常量的地址?
在我的節目我已經使用了聲明const int *ptr=&i;
但沒有使用任何const
預選賽變量我。兩個東西都困惑我:
1)當我試圖修改的值我使用ptr
,在那裏我已經使用const int *ptr=&i;
,我得到的錯誤assignment of read-only location '*ptr'|
,儘管我還沒有聲明的變量我與const
qualifier.So什麼究竟陳述const int *ptr=&i;
是什麼意思,它與int * const ptr=&i;
有什麼不同?
我有它鑽入我的頭const int *ptr=&i;
意味着指針存儲常量的地址,而int * const ptr=&i;
意味着指針本身是恆定的,今天一個用戶告訴我,在討論中不能change.But(LINK),其const int *ptr means the memory pointed to must be treated as nonmodifiable _through this pointer_
。我發現這個東西是新的,因爲這種意思是「一些選擇指針不能改變值(而其他人可以)」。我不知道這樣的選擇性聲明!!但是一位180K的老兵證明了這個用戶是正確!!因此,你可以用更清晰,更詳細,更嚴謹的方式說明這一點嗎?「const int * ptr =&i; 是什麼意思?
2)我還被告知,我們可以謊言在聲明const int *ptr=&i;
程序通過向pointer.What分配非恆定的地址是什麼意思?爲什麼我們允許這樣做?如果我們將一個非常量的地址賦給指向ptr
的指針,這個指針需要一個常量的地址,那麼爲什麼我們不會發出警告呢?如果它是如此寬容以便分配非常量的地址,爲什麼它會拋出一個錯誤當我們試圖改變那個非常量的值時,這是一個合理的事情,這個指向變量是一個非常量?
#include <stdio.h>
int main()
{
int i=8;
const int *ptr=&i;
*ptr=9;
printf("%d",*ptr);
}
錯誤:assignment of read-only location '*ptr'|
感謝您的回答。我放棄了這個問題! – 2013-05-14 14:00:50
儘管C可以爲「const」提供更多有用的語義[例如說如果一個參數被限定爲'const return',那麼在傳遞一個const參數時,返回值應該被當作'const'來處理,而當傳遞一個非const參數時應該被當作非const來處理 - 這對理想的語義'strchr']有許多場景涉及寫時複製對象,其中const正確性不能被靜態證明,並且語言必須不允許有用的語義或允許靜態驗證其正確性的構造。 – supercat 2016-10-12 23:06:30