C++中的指针和const

Joh*_*ino 2 c++ const

在处理指针和const时,我看到有三种方法来声明它们:

1)

int nValue = 5;
int *const pnPtr = &nValue;
Run Code Online (Sandbox Code Playgroud)

2)

int nValue = 5;
const int *pnPtr = &nValue;
Run Code Online (Sandbox Code Playgroud)

3)

const int 5;
const int *const pnPtr = &nValue;
Run Code Online (Sandbox Code Playgroud)

示例1被称为"Const指向非const的指针".地址不能更改,但值可能会更改.所以我们可以做类似下面的事情,因为例1中的nValue是一个非const int:

int nValue = 5;
int const *pnPtr = &nValue;

*pnPtr = 6; 
Run Code Online (Sandbox Code Playgroud)

但是我们不能在示例1中执行以下操作:

int nValue = 5;
int nValue2 = 6;
int const *pnPtr = &nValue;
pnPtr = &nValue2; 
Run Code Online (Sandbox Code Playgroud)

示例2被称为"指向const的指针".这意味着地址可以更改,但值不能.我们可以做到以下几点:

int nValue = 5;
int nValue2 = 6;

const int *pnPtr = &nValue;
pnPtr = &nValue2;
Run Code Online (Sandbox Code Playgroud)

但是我们在示例2中不能执行以下操作:

int nValue = 5;
int nValue2 = 6;

const int *pnPtr = &nValue;
*pnPtr = nValue2;
Run Code Online (Sandbox Code Playgroud)

示例3是"const指向const的指针".这意味着地址或值都不能改变:

const int nValue;
const int *const pnPtr = &nValue;  
Run Code Online (Sandbox Code Playgroud)

我的问题与第二个例子有关.当nValue不是const时,为什么第二个示例称为"指向const的指针".这是一个常规的int声明.另外,在第二个例子中,如果我们为另一个地址分配另一个地址具有不同的值时,我们不能仅仅依赖该地址,因此返回不同的值?这不会打败整个目的吗?

Die*_*ühl 5

const第二个例子适用于int,即你有一个非const指针const int.由于C和C++中的类型是从右向左读取的,因此最简单的方法是将const总是从右到右.它也是唯一可以始终如一地放置的地方:

int i(0);
int      *       p0(&i); // non-const pointer to non-const int
int const*       p1(&i); // non-const pointer to const int
int      * const p2(&i); // const pointer to non-const int
int const* const p3(&i); // const pointer to const int
Run Code Online (Sandbox Code Playgroud)

也就是说,你可以将const指针(p0p1可以改变,但p2p3不能),以及对实体的指针指向(*p0并且*p2可以改变,但*p1*p3不能更改).对于第二行和第四行,你可以交换int和,const但我建议反对这样做.