C++ 指向常量指针(或指向常量的指针)

C++ 指向常量指针(或指向常量的指针),c++,pointers,C++,Pointers,我有以下代码: #include <iostream> int main(){ int v1 = 20; int *p1 = &v1; int **p2 = &p1; return 0; } 现在我的代码不起作用了。 考虑到第一个案例整数*常数p1=&v1。 以下是我的更新代码,我认为应该是正确的: #include <iostream> int main(){ int v1 = 20; in

我有以下代码:

#include <iostream>

int main(){

    int v1 = 20;

    int *p1 = &v1;
    int **p2 = &p1;

    return 0;
}
现在我的代码不起作用了。 考虑到第一个案例<代码>整数*常数p1=&v1。 以下是我的更新代码,我认为应该是正确的:

#include <iostream>

int main(){

    int v1 = 20;

    int *const p1 = &v1;
    const int **p2 = &p1;

    return 0;
} 
#include <iostream>

int main(){

    int v1 = 20;

    const int *p1 = &v1;
    int **p2 = &p1;

    return 0;
} 
使指针指向常量意味着指针不能用于更改它所指向的对象的值。但是,指针可以更改其自身的值,即它可以指向其他对象。因为我可以更改指针的值,所以第二个指针不必指向常量

错误:从“常量int**”到“int**”[-fppermissive]的转换无效

我正在使用GNUCC编译器 我是C++新手,我迷路了。我想知道如何将指针指向与
const
相关的其他指针

int *const p1 = &v1;
此语句表示p1是一个
“指向整数的常量指针”

而这意味着p2是指向一个
“指向常量整数的指针”
,这与您的第一条语句相矛盾

所以第二个语句应该是(如果第一个语句不变):-

也就是说p2是指向一个
“指向整数的常量指针”

第一句话应该是(如果第二句话没有改变):-

也就是说p1是一个
“指向常量整数的指针”

我想知道如何将指针指向与const有关的其他指针

显然,在指向指针的指针中也需要使用
const

int *const p1 = &v1;
int *const* p2 = &p1;


const int *p1 = &v1;
const int **p2 = &p1;
基本规则非常简单,如果您有一个
T
类型的变量,则指向它的指针的类型为
T*
。因此,如果您有
int*const*
,那么指向它的指针是
int*const**
,而不是
const int**
,它是指向不同类型的指针

因为我可以更改指针的值,所以第二个指针不必指向常量

不,那是不对的

如果C++允许修改const数据,或尝试:无论如何:

const int v1 = 0;
const int* p1 = &v1;
int** p2 = &p1;
int* p3 = *p2;
*p3 = 1;              // modifies v1, which is const!

该规则的要点是强制执行类型安全,不允许您使用指向非常量的指针指向常量数据。

您的第一次重写没有起作用,因为您试图将常量指针的地址分配给指向指针的指针,其中最后的“指针对象”(即
int
)是常量,而不是中间的指针。换句话说,如果C允许

int *const p1 = &v1;
const int **p2 = &p1; // Not allowed
它应允许:

*p2 = &v2; // This would be legal.
但是,这会修改指针p1,据称它是常量

以下是第一次重写工作需要更改的内容:

int *const p1 = &v1;
int * const *p2 = &p1;
注意
const
是如何从声明之前移动到星号之间的。现在您正在创建一个指向int的常量指针

您的第二次重写失败,因为它完全删除了
const
-ness。要修复它,请将
const
放回声明的开头:

const int *p1 = &v1;
const int **p2 = &p1;

从右到左书写
常量(或一般的简历资历)是有帮助的

int const* p1 = &v1;

int const* *p2 = &p1;
没关系

int      * const p1 = &v1;

int const*      *p2 = &p1;
那不好

int const*  p1 = &v1;
int      * *p2 = &p1;
这也不好


你能找出模式吗?

你上一个代码中的
const int*p1
呢?这是否正确?这与您的第二句话“const int**p2=&p1”是一致的。对不起,我什么都不懂。@emperueraiman我试图鼓励您独立思考。你知道,学习效果和其他东西。如果你说“读
const
”而不是“写
const
”,我会理解得更好。我过了一段时间才理解了这篇文章,谢谢
const int *p1 = &v1;
const int **p2 = &p1;
int const* p1 = &v1;

int const* *p2 = &p1;
int      * const p1 = &v1;

int const*      *p2 = &p1;
int const*  p1 = &v1;
int      * *p2 = &p1;