为啥常量整数指针指向允许的非常量整数?

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&amp; b = a; 现在bb 的引用呢,但是即使a 不是const 也不能​​通过b 更改值 @tobi303 好的,本来没想到这也能正常工作。但现在我明白了下面有人称之为责任的想法,所以这是有道理的,谢谢你的帮助! 传值通常是通过void foo(const T&amp;)完成的,这只是意味着,在函数内部,值不能改变,但传递给函数的参数不一定是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 = &amp;a; // int* or const int* can assgin to const int*

【讨论】:

以上是关于为啥常量整数指针指向允许的非常量整数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥首先允许指针从非常量到常量的隐式转换?

为啥指针可以为NULL

为啥不允许“内联”静态常量,除了整数?

常量指针不能作为右值赋值给非常量指针

常(量)指针和指针常量

常量指针转换