指针在C中指向常量的奇怪行为

时间:2016-08-05 04:07:27

标签: c pointers const

我对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!

为什么会发生这样的事情?

3 个答案:

答案 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时,你只需告诉编译器不允许你改变那个指针的值,而不是存储在数组中的值。