假设我们有
int *p1;
const int **pp2= &p1;
const int n=13;
//这意味着我们不能使用pp2来修改其地址存储在* pp2中的//变量的值。 * pp2存储某个变量的地址(在本例中为n)
我正在阅读的书-C ++ primer表示以下陈述是完全合法的
*pp2=&n;
我觉得上述陈述违反了上述评论中所写的内容。
请有人帮忙清楚这一点。非常感谢
答案 0 :(得分:3)
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*
的地址。它的类型是const int **pp2= &p1;
。该语句不会对其进行初始化,因此它包含一个未指定的地址(值 it 可以保存)。
pp2
以上尝试创建并分配给变量名int const **
。它的类型为p1
,语句会尝试为其分配&p1
的地址。现在表达式int **
的类型为const
,分配失败,因为\t
资格不匹配。
如您所见,代码与(可能已更正的)语句完全一致。
答案 1 :(得分:2)
首先,请注意您的示例代码本身无法编译(至少在我正在使用的编译器中),因为行int **
尝试将const int **
分配给{{ 1}} - 看看here。
我相信阅读该页面可以帮助您理解您所面临的问题。
答案 2 :(得分:2)
我们可以用一个简单的例子来理解它,我们在下面写下声明,
const int * p;
它说* p是常数而不是p。 p可以存储任何指向常量整数的地址。
同样,const int ** p;
它指向指向常量int的指针。你可以改变p和* p而不是** p。 *在你的情况下,P可以保存指向像& n这样的整数的任何地址,你可以用任何指向常数整数的地址来改变* P.
希望它能解释你更多:: :)