使用const int * const指针指向int

时间:2013-02-08 19:16:31

标签: c++ pointers const

我在这里听不懂。在下面的代码中,我定义了一个整数和一个常量整数。

我可以让一个常量指针(int * const)指向一个整数。见第四行代码。

相同的常量指针(int * const)不能指向常量整数。见第五行。

指向const(const int * const)的常量指针可以指向一个常量整数。这就是我所期望的。

但是,允许相同的(const int * const)指针指向非常量整数。见最后一行。为什么或如何做到这一点?

int const constVar = 42;
int variable = 11;

int* const constPointer1 = &variable;
int* const constPointer2 = &constVar; // not allowed
const int* const constPointer3 = &constVar; // perfectly ok
const int* const constPointer4 = &variable; // also ok, but why?

5 个答案:

答案 0 :(得分:2)

int const constVar = 42;  // this defines a top-level constant
int variable = 11;

int *const constPointer1 = &variable;

int *const constPointer2 = &constVar; // not allowed because you can change constant using it

const int *const constPointer3 = &constVar; // perfectly ok. here you can't change constVar by any mean. it is a low level constant.

const int *const constPointer4 = &variable; // also ok, because it says you can't change the value using this pointer . but you can change value like variable=15 .

*constPointer4=5; //you get error assignment of readonly location.because that pointer is constant and pointing to read only memory location.

答案 1 :(得分:1)

const比非const具有更少的访问权限,这就是允许它的原因。你将无法通过指针改变“变量”,但这并没有违反任何规则。

variable = 4; //ok
*constPointer4 = 4; //not ok because its const

在调用函数时,你经常使用这个“const指向非const变量”的情况。

void f(const int * const i)
{
    i=4; //not ok
}

f(&variable);

答案 2 :(得分:1)

您始终可以决定不修改非const变量。

const int* const constPointer4 = &variable;

解析定义:constPointer4是一个const(即你不能改变它指向的东西)指向const int的指针(即variable)。这意味着您无法通过 variable修改constPointer4 ,即使您可以通过其他方式修改variable

相反(通过非const指针访问const变量),您需要const_cast

为什么指向const的指针有用?它允许你在类中拥有const成员函数,你可以向用户保证该成员函数不会修改对象。

答案 3 :(得分:0)

指向const对象的指针不能用于修改该对象。别人是否可以修改它并不重要;它只是无法通过该指针完成。

int i;               // modifiable
const int *cip = &i; // promises not to modify i
int *ip = &i;        // can be used to modify i

*cip = 3; // Error
*ip = 3;  // OK

答案 4 :(得分:0)

第4行

int* const constPointer2 = &constVar;

这里不应该被允许,因为“int * const constPointer2”的int * const部分意味着指针是连续的,然后当你继续并将它分配给& constVar