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

时间:2016-04-08 09:11:59

标签: c++ pointers const

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

任何人都可以解释为什么这会编译吗?

4 个答案:

答案 0 :(得分:4)

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

如果您想确保不会更改值,您应该让t指向const,例如

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

对于这种情况,您无法指向int*指针。

int* t = &a; // error

答案 1 :(得分:3)

  

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

你不能一般地做出这个假设,因为t可能指向非const对象,例如在你的例子中。

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

任何人都可以解释为什么这会编译吗?

c ++规则允许将T*隐式转换为const T*。它是允许的,因为对非const对象有一个指向const(或引用)的指针是非常有用的。指向const的指针只是意味着无法通过指针修改对象。对象本身可以是const,也可以是非const。

作为一个有用的原因的例子,你可以将一些可修改的状态作为对象的私有成员,并返回const视图,以便其他人可以观察,但不能修改。一个实际的例子是std::string::c_str()。即使const char*的内部缓冲区是非常量的,也会返回std::string

答案 2 :(得分:0)

  

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

答案很简单:指针类型声明中的const关键字并不意味着&#39;它是常数&#39;但更确切地说,你不能修改它。

这很有用,例如当你创建一个变量然后调用另一个函数来做某事时,你想要禁止修改:

    extern int countZerosInArray( const int *array, int arrayLen);

    int myVariableArray[ 100 ];
    // ... fill the array - i.e. modify it!
    int noOfZeros = countZerosInArray(myVariableArray, 100);

countZerosInArray函数被告知它具有对数组的只读访问权限,尽管数组本身当然不是常量。

答案 3 :(得分:-4)

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