2016-08-05 139 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