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

4

我有这段代码:

#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 = &v1;。 这是我更新后的代码,我认为应该是正确的:

#include <iostream>

int main(){

    int v1 = 20;

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

    return 0;
} 

让指针本身成为const意味着它不能指向另一个对象,但是它所指的对象的值可以被改变。所以如果我想将另一个指针指向先前的指针p1,我需要确保这个第二个指针不能用于改变p1的值,因此我将它(p2)作为指向const的指针。但它不起作用。
错误:无效转换从'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的其他指针的指针指向它们。

4个回答

3
我想知道如何将涉及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 **

由于我可以更改指针的值,因此第二个指针不需要指向const。

不,这是错误的。

如果C++允许这样做,则可以修改常量数据或尝试修改:

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

这个规则的意思是为了强制类型安全,不允许你用一个非 const 的指针指向一个 const 数据。


3
你的第一个重写尝试将常量指针的地址分配给指向指针的指针,其中最终的“pointee”(即 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从声明前移动到星号之间。现在你正在创建一个指向常量指针的整数。
你的第二个改写失败了,因为它完全省略了const。为了修复它,请将const放回声明的开头。
const int *p1 = &v1;
const int **p2 = &p1;

1
int *const p1 = &v1;

这个语句是在说p1是一个“指向整数的常量指针”。
const int **p2 = &p1;     //wrong

而这里说的是p2指向一个"常量整数的指针",这与您的第一句话相矛盾。

因此,如果第一句话不变,则第二句话应为:

int* const *p2 = &p1;

这句话的意思是p2是指向一个“整数常量指针”的指针。

或者

如果第二个语句没有改变,第一个语句应该是:

const int *p1 = &v1;

这将说明p1是一个"指向常量整数"的指针。


你最后的代码里 const int *p1 怎么样?它是正确的吗? - wingerse
1
这与您的第二个语句“const int **p2 =&p1”兼容。 - ravi

1
写下 const (或一般的 cv 限定符)时,从右向左阅读会更有帮助。
int const* p1 = &v1;

int const* *p2 = &p1;

那没关系。

int      * const p1 = &v1;

int const*      *p2 = &p1;

那不行。

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

我也不认为这样可以。

你能发现规律吗?


抱歉,我一点也不明白。 - wingerse
@EmpereurAiman 我试图鼓励你自己思考。嘿,学习效果和那些东西哦。 - Columbo
如果你说“读取const”而不是“写入const”,我会更好地理解的 :) 经过一段时间后,我已经理解了这篇文章,谢谢。 - wingerse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接