2016-08-05 144 views
0

我對恆指針的奇怪行爲,一些問題在C.怪異的行爲

1.

int x = 1; 
const int *ptr = &x; 
x = 2; 
printf("%d %d",*ptr, x); 

由於指針ptr指向const int的,我期待一個錯誤在第三行。 (因爲「1」已經被保存在指針PTR和在指針值不能改變,因爲我已經加入「常量」!)

2.

double rates[3] = {0.1,0.2,0.3}; 
const double *ptr = rates; 
ptr[2] = 99.99; 

從第二行中,PTR是費率地址[0]。由於只有* ptr = rates [0]是const double的,所以我期望從第三行發生錯誤!

爲什麼會發生這種情況?

+2

您不能從ptr更改x的值,但可以將其從x更改爲x。 x不是常量。你的指針的值永遠不會改變。您的指針*指向的值已更改。公寓的地址沒有變化。誰住在那間公寓裏。 –

+0

在第一個例子中,如果你沒有'ptr'你會期望'x = 2'賦值失敗嗎?爲什麼不?爲什麼你會期望它失敗,只是因爲你添加了另一個*無關的變量?在第二個例子中,你做了與第一個相反的事情。 –

回答

3

記住

const double *ptr; // Remember it like (const double) <- *ptr; 

意味着ptr指向const double,這只是意味着你不能使用指針本身更改數據指向。但是,如果原始數據本身不是恆定的,你可以使用任何其他代理來修改這個值就像你在

案例做了1

const int *ptr = &x; 
x = 2; // You use x itself to change the value 

由於指針ptr指向const int的,我預計在第三行 錯誤。

您不會收到錯誤,因爲您沒有通過指針更改x。 如果你現在

*ptr=2; //you get an error 

案例2

我預料沒有錯誤從第三行發生

const double *ptr = rates; 
ptr[2] = 99.99; 

這是第一個相反的情況下,你用指針來改變常量數據, 如果該行爲

rates[2] = 99.99; 

你應該沒有錯誤。

3

x不是const。所以x = 2;是好的。

const int *ptr;並不意味着「ptr指向const int」。這意味着「ptr可能指向int,這可能是或可能不是const;並且您不允許使用*ptr來寫入該int」。

因爲「1」已經被保存在指針PTR

不,保存在指針的東西是一個內存位置的地址。 1保存在指針保存地址的內存位置。

僅* PTR =率[0]是常量雙

這是沒有意義的。 ptr[2]表示*(ptr + 2);並在const double *上使用+ 2會產生另一個指向不同存儲位置的const double *

1

Const只是告訴編譯器不要讓你直接改變那個變量的值。這並不能改變它。您仍然可以像指導那樣使用指針更改值。

當您使用帶指針的const時,您只需告訴編譯器不要讓您更改該指針的值,而不是更改該數組中存儲的值。

+0

我希望這是有道理的,如果它太混亂讓我知道,我會給你一些閱讀材料。 – Michel