【发布时间】:2019-01-15 06:43:01
【问题描述】:
这是常见的“分配时丢弃的 const 限定符”错误的来源。但是,我不明白为什么这样做是非法的?
考虑这段代码,
int sum_array(const int *a, int n){
int sum, *i;
sum = 0;
for(i = a; i<a+n; i++)
sum += *i;
return sum;
}
显然我可以使用i = 0 和比较a + i < a+n 进行相同的操作;但是,为什么简单地将变量的地址复制到另一个变量中是非法的,这对我来说没有意义?
通常,const 变量表示变量的值不能更改。例如。 const int x = 7,这里我们声明x的值不能从7改变。
但是,使用 const 指针,创建更改变量的“潜力”也是非法的。 IE。 i = a 不会改变 a 指向的值,真正“非法”的应该是 *i = 0,但是,i = a 仍然是非法的,因为它让我们有可能改变 a。
我知道你可以回答我“因为语言是这样创建的”,我只是想知道我在这里是否遗漏了什么。
【问题讨论】:
-
您不应该使用指向非常量数据的指针来修改常量(不可修改)的数据。使用
const int *i;可以防止您写入(意外)sum += (*i = 3);或同样不可信的东西,它会修改i指向的值。 -
在这种特殊情况下,本地指针只会增加混乱。正确编写的代码是
int sum_array(const int *a, int n){ int sum = 0; for(size_t i = 0; i<n; i++) sum += a[i]; return sum; }。 -
“为什么在 C 中创建一个指向常量指针的指针是非法的?”,不要吹毛求疵,但这句话是不是有点误导? OP 的示例中没有“常量指针”。要拥有
const pointer,必须编写类似int sum_array(int * const a, int n)的内容。现在指针a是常量。 -
你是对的,类型保护指针之前的 const 和类型保护指向的对象之后的 const,我的错误。我更新了标题,希望它足够准确。