c - 为什么在 C 中创建指向 const 的指针的指针是非法的?

标签 c pointers memory

这是常见的“赋值时丢弃 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 的主要目的是获得编译器的帮助,以确保您不会意外修改给定的对象。它为此使用类型系统。如果愿意,您实际上可以通过编写显式强制转换来规避它;但通常你不想要那个,因为如果你想要那个,那通常意味着你并不真的想要 const 开始。

关于c - 为什么在 C 中创建指向 const 的指针的指针是非法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54193869/

相关文章:

C - 释放数组内的指针

c++ - 如何使用成员函数从 main() 访问数组?

c - DOS/4GW fatal error (1307) : not enough memory

c - 为什么运行它不会发出段错误?

sql - PostgreSQL CREATE TABLE AS 命令创建一个 OUT OF MEMORY 错误

c - 重新分配两次后出现段错误

在给定预序序列的情况下,用 C 语言构造一棵只有叶子的树

c - 如何在C中的fopen中使用字符串数组作为txt文件名

c - STM32F4 I2C 无库

java - 交换方法在 C# 中如何在内存级别工作?