指向 const 指针(或指向 const 的指针)

Posted

技术标签:

【中文标题】指向 const 指针(或指向 const 的指针)【英文标题】:Pointing to a const pointer (or a pointer to a const) 【发布时间】:2014-11-29 13:15:22 【问题描述】:

我有这个代码:

#include <iostream>

int main()

    int v1 = 20;

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

    return 0;

我在这里要做的是将一个指针指向另一个指针,在这种情况下它可以正常工作。

我将 p1 设为 const 指针或指向 const 的指针:

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

现在我的代码不起作用。 考虑第一种情况。 int *const p1 = &amp;v1;。 这是我更新的代码,我认为应该是正确的:

#include <iostream>

int main()

    int v1 = 20;

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

    return 0;
 

使指针本身const 意味着它不能指向另一个对象,但它所指向的那个对象的值可以改变。因此,如果我想将另一个指针指向前一个指针p1,我需要确保第二个指针不能用于更改p1 的值所以我将它(p2)设为指向@ 987654331@。但它不起作用。

错误: : 从 'int* const*' 到 'const int**' 的无效转换 [-fpermissive]

同样,第二种情况也失败了。我认为应该是正确的代码:

#include <iostream>

int main()

    int v1 = 20;

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

    return 0;
 

使指针指向 const 意味着指针不能用于更改它所指向的对象的值。但是,指针可以改变它自己的值,即它可以指向其他对象。由于我可以更改指针的值,因此第二个指针不必指向 const。

错误:从 'const int**' 到 'int**' 的无效转换 [-fpermissive]

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

【问题讨论】:

【参考方案1】:

你的第一次重写没有成功,因为你试图将一个常量指针的地址分配给一个指向指针的指针,其中最终的“指针”(即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;

【讨论】:

【参考方案2】:

我想知道如何将指针指向与 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!

规则的重点是强制类型安全,不允许您使用指向非 const 的指针指向 const 数据。

【讨论】:

【参考方案3】:

从右到左书写const(或一般的 cv-qualifications)很有帮助。

int const* p1 = &v1;

int const* *p2 = &p1;

没关系。

int      * const p1 = &v1;

int const*      *p2 = &p1;

这样不行。

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

那也不行。

你能看出其中的规律吗?

【讨论】:

对不起,我什么都不懂。 @EmpereurAiman 我试图鼓励你自己思考。你知道,学习效果和东西。 如果您说“阅读 const 的 ....”而不是“写 consts”,我会更好地理解 :) 一段时间后我理解了这篇文章,谢谢【参考方案4】:
int *const p1 = &v1;

这个声明是说 p1 是一个"constant pointer to integer"

const int **p2 = &p1;     //wrong

而这是说 p2 是指向 "pointer to constant integer" 的指针,这与您的第一条语句相矛盾。

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

int* const *p2 = &p1;

表示 p2 是指向 "constant pointer to integer" 的指针。

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

const int *p1 = &v1;

也就是说 p1 是"pointer to constant integer"

【讨论】:

您上一个代码中的const int *p1 怎么样?会正确吗? 这与您的第二条语句“const int **p2 = &p1”兼容

以上是关于指向 const 指针(或指向 const 的指针)的主要内容,如果未能解决你的问题,请参考以下文章

将“指向 const 的指针”转换为“指向 const VLA 的指针”

指针和const

为啥我们不能定义一个指向 int 指针的低 + *** const 指针?

C++,成员函数返回对包含指向 const 对象的指针的向量的 const 引用

const 指向成员的指针是不是默认指向 int?

typedef 模板,接受指向 const 和非 const 函数的指针