为什么允许常量整数指针指向非常量整数

Why a constant integer pointer point to a non constant integer allowed?

本文关键字:整数 常量 指针 非常 为什么 许常量      更新时间:2023-10-16

我目前正在尝试学习一些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;
}

有人能解释为什么这是编译的吗?

const int* t只是意味着您不能更改t指向的值t,仅此而已。原始值可能会更改,但与t的责任无关。

如果你想确保这个值不会被更改,你应该让t指向一个常量,比如

const int a = 3;
const int* t = &a;

对于这种情况,你不能让int*指针指向它

int* t = &a; // error

由于t是指向const int的指针,只要我们不更改t,我希望*t保持不变。

一般情况下,您不能做出这样的假设,因为t可能指向一个非常量对象,例如您的示例。

const int* t = &a; //Why is this allowed? a is NOT const int

有人能解释为什么这是编译的吗?

c++的规则允许CCD_ 15到CCD_ 16的隐式转换。这是允许的,因为有一个指向常量(或引用)的指针指向非常常量对象非常有用。指向const的指针只是表示不能"通过"指针来修改对象。对象本身可以是常量,也可以是非常量。

作为一个有用的例子,您可以将一些可修改的状态作为对象的私有成员,并将const视图返回给它,以便其他人可以观察,但不能修改。这方面的一个实际例子是CCD_ 18。即使std::string的内部缓冲区是非常量的,它也返回const char*

由于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函数被告知它对数组具有只读访问权限,尽管数组本身当然不是常量。

const int* t = &a; // int* or const int* can assgin to const int*