为啥常量整数指针指向允许的非常量整数?
Posted
技术标签:
【中文标题】为啥常量整数指针指向允许的非常量整数?【英文标题】:Why a constant integer pointer point to a non constant integer allowed?为什么常量整数指针指向允许的非常量整数? 【发布时间】:2016-04-08 09:11:59 【问题描述】:我目前正在尝试学习一些 C++,但遇到了以下不直观的行为。由于t
是指向const int
的指针,我希望*t
保持不变,只要我们不更改t
。
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
int a = 3;
const int* t = &a; //Why is this allowed? a is NOT const int
a = 4;
cout << *t << endl; //This does then print 4
//*t = 4; //Throws error.
return 0;
谁能解释为什么会编译?
【问题讨论】:
为了消除混乱,我建议在没有指针的情况下开始。int a = 1; const int b = a;
很好,现在b
是 const 而a
不是,即使保持相同的值
@tobi303 是的,但在您的示例中,b
收到了a
值的副本。
好吧,那么int a = 1; const int& b = a;
现在b
是b
的引用呢,但是即使a
不是const 也不能通过b
更改值
@tobi303 好的,本来没想到这也能正常工作。但现在我明白了下面有人称之为责任的想法,所以这是有道理的,谢谢你的帮助!
传值通常是通过void foo(const T&)
完成的,这只是意味着,在函数内部,值不能改变,但传递给函数的参数不一定是const
【参考方案1】:
const int* t
仅表示您无法更改 t
指向的值 t
,仅此而已。原值可能会改变,但与t
的职责无关。
如果你想保证值不会被改变,你应该让t
指向一个const,比如
const int a = 3;
const int* t = &a;
对于这种情况,您不能将int*
指针指向它。
int* t = &a; // error
【讨论】:
这是有道理的。我预计const int*
只能接受const int
的地址!
@flawr int*
可以隐式转换为 const int*
,这只是意味着您不会通过它更改值。例如你可以给函数传递一个int*
,如果你不改变函数内部的值,你可以让函数以const int*
作为参数。【参考方案2】:
由于 t 是指向
const int
的指针,我希望*t
保持不变,只要我们不更改t
。
一般情况下,您不能做出这样的假设,因为t
可能指向一个非常量对象,例如在您的示例中。
const int* t = &a; //Why is this allowed? a is NOT const int
谁能解释为什么会编译?
c++ 的规则允许将T*
隐式转换为const T*
。这是允许的,因为有一个指向非 const 对象的指针(或引用)非常有用。指向 const 的指针仅仅意味着不能“通过”指针修改对象。对象本身可以是 const 或非 const。
作为一个为什么它有用的例子,你可以有一些可修改的状态作为对象的私有成员,并返回const
视图给它,以便其他人可以观察,但不能修改。一个实际的例子是std::string::c_str()
。即使std::string
的内部缓冲区是非常量的,它也会返回const char*
。
【讨论】:
感谢您的解释!现在将类型视为您可以通过该确切变量执行的操作时,这很有意义。【参考方案3】:由于
t
是指向const int
的指针,我希望*t
保持不变,只要我们不更改t
。
答案很简单:指针类型声明中的const
关键字并不意味着“它是常量”,而是“不允许修改它”。
这很有用,例如当您创建一个变量然后调用另一个函数对其进行处理,但您想禁止修改时:
extern int countZerosInArray( const int *array, int arrayLen);
int myVariableArray[ 100 ];
// ... fill the array - i.e. modify it!
int noOfZeros = countZerosInArray(myVariableArray, 100);
countZerosInArray
函数被告知它对数组具有只读访问权限,尽管数组本身当然不是常量。
【讨论】:
【参考方案4】:const int* t = &a; // int* or const int* can assgin to const int*
【讨论】:
以上是关于为啥常量整数指针指向允许的非常量整数?的主要内容,如果未能解决你的问题,请参考以下文章