【问题标题】:Using double pointers with const使用带 const 的双指针
【发布时间】:2016-11-20 11:15:29
【问题描述】:

假设我们有

int *p1;
const int **pp2= &p1;
const int n=13;

//这意味着我们不能使用pp2来修改地址存储在* pp2中的//变量的值。 * pp2 存储了某个变量的地址(下例中为 n)

我正在阅读的书 -C++ 入门书说以下语句是完全合法的

*pp2=&n;

感觉上面的说法违反了上面cmets写的事情。

有人可以帮忙解决这个问题吗?非常感谢

【问题讨论】:

  • 查看 here 以获取有关该主题的广泛讨论。

标签: c++ pointers constants


【解决方案1】:

通过一个简单的例子有助于理解它。当你在下面写声明时:

const int *p;

它说*p 是常量而不是pp 可以存储任何指向常量整数的地址。

同样const int **p; 表示指向常量 int 的指针。您可以更改p*p,但不能更改**p。在您的情况下,*p 可以保存任何指向常量整数的地址,例如 &n,您可以使用任何指向常量整数的地址更改 *P

【讨论】:

  • 非常感谢。解释得很好。
【解决方案2】:

&n 的类型是int const *
*pp2 的类型是int const *

在这种情况下,const 限定了指针对象,而不是指针。

因此将一个分配给另一个是完全有效的。您引用的评论可能是错误的,也许应该说:

// Which means we can't use **pp2 to modify the value of the
// variable whose address is stored in *pp2.

详细说明:

int *p1;

上面创建了一个名为p1的变量,可以存储int的地址。它的类型是int*。该语句不初始化它,因此它持有一个未指定的地址(值 it 可以持有)。

const int **pp2= &p1;

以上尝试创建并分配给变量名称pp2。它的类型是int const **,该语句尝试为其分配p1 的地址。现在表达式&p1 的类型为int **,并且分配失败,因为const 资格不匹配。


如您所见,代码与(可能已更正的)语句完全一致。

【讨论】:

  • 已编辑。谢谢您的回答。你能否再澄清一点。我是cpp的新手。再次感谢
【解决方案3】:

首先,请注意您的示例代码本身无法编译(至少在我使用的编译器中),因为const int **pp2= &p1; 行尝试将int ** 分配给const int ** - 采取看here

我相信阅读该页面也将帮助您了解您面临的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-08
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多