指向 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 = &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
的 ....”而不是“写 const
s”,我会更好地理解 :) 一段时间后我理解了这篇文章,谢谢【参考方案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 的指针”
为啥我们不能定义一个指向 int 指针的低 + *** const 指针?