我在这里听不懂。在下面的代码中,我定义了一个整数和一个常量整数。
我可以让一个常量指针(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?
答案 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