C++ 使用带有常量的双指针

C++ 使用带有常量的双指针,c++,pointers,constants,C++,Pointers,Constants,假设我们有 int *p1; const int **pp2= &p1; const int n=13; //这意味着我们不能使用pp2修改地址存储在*pp2中的//变量的值。 *pp2存储某个变量的地址(在下面的示例中为n) 我正在读的《C++入门》一书说,以下声明是完全合法的 *pp2=&n; 我认为上述声明违反了上述评论中的内容 谁能帮我弄清楚这件事。非常感谢类型&n为int const* *pp2的类型是int const* 在本例中,const限定指针对象,而不是指

假设我们有

int *p1;
const int **pp2= &p1;
const int n=13;
//这意味着我们不能使用pp2修改地址存储在*pp2中的//变量的值。 *pp2存储某个变量的地址(在下面的示例中为n)

我正在读的《C++入门》一书说,以下声明是完全合法的

*pp2=&n;
我认为上述声明违反了上述评论中的内容


谁能帮我弄清楚这件事。非常感谢类型
&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*
。此语句不初始化它,因此它包含一个未指定的地址(它可以包含的值)

上面尝试创建并分配给变量名
pp2
。它的类型是
int const**
,语句试图为它分配
p1
的地址。现在表达式
&p1
的类型为
int**
,赋值失败,因为
const
条件不匹配



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

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


我相信阅读这一页也会帮助你理解你所面临的问题。

用一个简单的例子来理解它会有帮助。当您在下面填写声明时:

const int *p;
它说,
*p
是常数,而不是
p
p
可以存储指向常量整数的任何地址


类似地,
const int**p
表示指向常量int的指针。您可以更改
p
*p
,但不能更改
**p
*p
可以保存指向常量整数的任何地址,如您的案例中的
&n
,您可以使用指向常量整数的任何地址更改
*p

已编辑。谢谢你的回答。请你再澄清一下好吗。我是cpp的新手。再次感谢大家对这个话题的广泛讨论。非常感谢。解释得很好。
const int *p;