【问题标题】:How does the const keyword affect a pointer that is pointing towards a const variable?const 关键字如何影响指向 const 变量的指针?
【发布时间】:2017-04-14 13:22:40
【问题描述】:

如果你考虑这个:

int *var1;
const int *var2 = var1;

为什么

*var1 = x; 

编译和

*var2 = x; 

没有?

【问题讨论】:

  • 这就是 const 的用途...

标签: c pointers constants


【解决方案1】:

你的情况

 *var2 = x;

编译失败并显示错误消息(大约),

错误:分配只读位置*var2

 *var2 = 10;
       ^

因为您已将值标记为 const 合格。


要详细说明,您可以阅读类似的声明

  const int *var2;

作为,var2声明为指向const int的指针。所以var2指向的值是常数,不能改变。

如果你希望指针本身是 const 限定的,你需要写类似

 int * const var2;

这基本上是将var2 声明为const 指向int 的指针。

因此,稍后任何将 assign 分配给 var2 的尝试都会产生错误,但访问 *var2 会正常工作,因为指针指向的值不再是 const 限定的。

【讨论】:

  • 谢谢。你的解释是我在教科书中读到的。但是,如果您从字面上阅读编译错误消息,那根本没有意义。这就是为什么。诠释 x; int *px = x;常量 int *cpx = px;假设 x 占用 100 的地址。这意味着 px 的值为 100。100 的内存地址不在只读位置。编译错误消息不仅具有误导性,而且绝对错误。它应该说“无法使用 const int * 修改值”。
  • @Nguaial 为什么会这样?我觉得相当准确。似乎是什么问题?
  • 你的解释是准确的。你做得很好!!!!但我抱怨编译错误消息。关于“分配只读位置‘*var2’”的部分。它应该更像“无法使用 const int * 赋值。”。
  • @Nguaial 同意“错误:分配只读位置 '*var2'”会误导。即使该位置是可写的,这也是一个编译错误。 const int * 描述的是指针 var2,而不是它指向的内存。
  • @Nguaial 你认为“只读位置”是指“只读内存中的位置”,但实际上它只是“禁止通过该指针写入的位置” ”。常量限定总是跟随指针(或变量),而不是对象。
【解决方案2】:

在这种情况下 const int * 的用法帮助我理解了:

int 
sum( const int *x, const int *y )
{
    return *x + *y;
}

int
main(void)
{ 
    int x = 10;
    int y = 10;
    int sum;

    sum = sum &x, *y );
}

通过将 const int * 限定符放在函数论证中,这表示值 x 和 y 在函数内部是不可变的(不可修改)。

但除了这种用法,我发现 const int * 非常令人困惑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多