指向指向法线变量的常量的指针

pointer to a constant pointing to normal variable

本文关键字:常量 指针 变量      更新时间:2023-10-16
char var = 'a';
const char *ptr;
ptr = &var;
*ptr = 'b'; //(i understand this is wrong)
var = 'b'; // (why is this wrong)

我无法更改"var"的值。 这是否意味着我已经通过将"var"的声明分配给此指针(指向常量的指针)将"var"的声明从 char 更改为 const char。所以规则不应该是指向常量的指针应该只有常量变量的地址吗?提前谢谢。

我无法更改"var"的值。

是的,你可以。你在最后的陈述中这样做,var = 'b';

这是否意味着我已经将"var"的声明从char更改为const char

不。 var是,一直都是,将来也永远是一个可变的char

所以规则不应该是指向常量的指针应该只有常量变量的地址吗?

不。指针到常量的唯一特别之处在于,您无法通过此特定指针更改指向的对象。完全有可能以其他方式更改对象,就像您展示自己一样,只要对象本身是可变的。


这是理解正在发生的事情的另一种方法:

  1. 存在一个对象,它是一个可变的char
  2. 在计算 id-expression var 时,将获得一个 char 类型的可修改左值,该左值指定该对象。通俗地说,您可以说"对象具有名称" var "。
  3. 当你计算表达式*ptr时,你会得到一个类型为 const char 的(不可修改的)左值,它也指定了我们在 (1) 中提到的同一对象。
通常有很多方法

可以指定同一对象,也就是说,有很多方法可以将对象称为某种表达式的值。有时这些值是可变的,有时它们是不可变的。(只有当对象本身是常量时,才不允许通过可变值修改它;但通常很难获得指定常量对象的可变值——你需要像 const_cast 这样的东西,或者在 C 中限定符丢弃强制转换。

这行没有错:

var = 'b'; // (why is this wrong)

你的编译器抱怨过吗? 我的没有。