C++ 使用常量int*常量指针指向int

C++ 使用常量int*常量指针指向int,c++,pointers,constants,C++,Pointers,Constants,我不明白这里有什么。在下面的代码中,我定义了一个整数和一个常量整数 我可以有一个指向整数的常量指针(int*const)。请参阅第四行代码 同一常量指针(int*const)不能指向常量整数。见第五行 指向常量(const int*const)的常量指针可以指向常量整数。这就是我所期望的 但是,允许相同的(const int*const)指针指向非常量整数。请看最后一行。这为什么或如何可能 int const constVar = 42; int variable = 11; int* con

我不明白这里有什么。在下面的代码中,我定义了一个整数和一个常量整数

我可以有一个指向整数的常量指针(int*const)。请参阅第四行代码

同一常量指针(int*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?

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

variable = 4; //ok
*constPointer4 = 4; //not ok because its const
在调用函数时,经常使用这种“指向非常量变量的常量指针”的情况

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

f(&variable);

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

variable = 4; //ok
*constPointer4 = 4; //not ok because its const
在调用函数时,经常使用这种“指向非常量变量的常量指针”的情况

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

f(&variable);

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

const int* const constPointer4 = &variable;
只需解析定义:
constPointer4
是指向常量int(即
变量
)的常量指针(即,您不能再更改它指向的内容)。这意味着您不能通过
constPointer4
修改
变量
,即使您可以通过其他方式修改
变量

另一种方法(通过非常量指针访问常量变量)则需要
const\u cast


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

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

const int* const constPointer4 = &variable;
int const constVar = 42;  // this defines a top-level constant
int variable = 11;
只需解析定义:
constPointer4
是指向常量int(即
变量
)的常量指针(即,您不能再更改它指向的内容)。这意味着您不能通过
constPointer4
修改
变量
,即使您可以通过其他方式修改
变量

另一种方法(通过非常量指针访问常量变量)则需要
const\u cast

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

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

int*const constPointer2=&constVar;//不允许,因为您可以使用它更改常量

const int*const constPointer3=&constVar;//很好。在这里,你无论如何都不能改变consvar。这是一个低电平常数。

const int*const constPointer4=&variable;//也可以,因为它表示不能使用此指针更改值。但您可以更改变量=15这样的值。

*constPointer4=5//您得到了只读位置的错误分配。因为该指针是常量并且指向只读内存位置。

int*const constPointer1=&variable

int*const constPointer2=&constVar;//不允许,因为您可以使用它更改常量

const int*const constPointer3=&constVar;//很好。在这里,你无论如何都不能改变consvar。这是一个低电平常数。

const int*const constPointer4=&variable;//也可以,因为它表示不能使用此指针更改值。但您可以更改变量=15这样的值。


*constPointer4=5//您得到只读位置的错误分配。因为该指针是常量,并且指向只读内存位置。

指向常量对象的指针不能用于修改该对象。其他人是否可以修改它并不重要;它就是不能通过那个指针来完成

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

指向常量对象的指针不能用于修改该对象。其他人是否可以修改它并不重要;它就是不能通过那个指针来完成

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行

这里不允许使用,因为“int*const constPointer2”的int*const部分意味着指针是contant的,然后当您继续并将其分配给&constVar

行4时


这里不允许使用,因为“int*const constPointer2”的int*const部分表示指针是contant,然后当您继续将其分配给&constVar

时,您似乎对const关键字在这里的含义有误解
const int*
并不意味着“我指向的int是const”,它意味着“我不会使用此指针更改我指向的int”。无论你指向的int是否是const,都不会改变正在发生的事情。谢谢你的回答和评论。就像比尔在评论中写的那样,我错了。C++有时会很难得到。看起来你对const关键字的含义有误解。code>const int*
并不意味着“我指向的int是const”,它意味着“我不会使用此指针更改我指向的int”。无论你指向的int是否是const,都不会改变正在发生的事情。谢谢你的回答和评论。就像比尔在评论中写的那样,我错了。有时候,C++很难得到。