我对C中指针常量的奇怪行为有疑问。
1
int x = 1;
const int *ptr = &x;
x = 2;
printf("%d %d",*ptr, x);
由于指针ptr指向const int,我预计第三行会出错。 (因为" 1"已经保存在指针ptr中,指针中的值不能改变,因为我添加了" const"!)
2
double rates[3] = {0.1,0.2,0.3};
const double *ptr = rates;
ptr[2] = 99.99;
从第二行开始,ptr是rate [0]的地址。我预计第三行不会发生错误,因为只有* ptr = rates [0]是const double!
为什么会发生这样的事情?
答案 0 :(得分:3)
x
不是const
。所以x = 2;
没问题。
const int *ptr;
并不意味着" ptr指向const int"。这意味着" ptr可能指向int
,它可能是也可能不是常量;并且您不能使用*ptr
写信给int
。"
因为" 1"已经保存在指针ptr
中
不,指针中保存的东西是内存位置的地址。 1
保存在指针保存地址的内存位置。
只有* ptr = rates [0]是const double
这没有任何意义。 ptr[2]
表示*(ptr + 2)
;并在+ 2
上使用const double *
会产生指向不同内存位置的另一个const double *
。
答案 1 :(得分: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;
你没有错误。
答案 2 :(得分:1)
Const只是告诉编译器不允许您直接更改该变量的值。它无法改变它。您仍然可以使用指针更改值,就像您一样。
当你使用带指针的const时,你只需告诉编译器不允许你改变那个指针的值,而不是存储在数组中的值。