您的回答非常有助于清除我对const
我今天意识到的这一点的理解中的这个主要缺陷。
在我的程序中,我使用了该语句const int *ptr=&i;
,但没有对变量iconst
使用任何限定符。有两件事让我感到困惑:
1)当我尝试使用我使用的地方修改i的值时,我得到错误,即使我没有用限定符声明变量i 。那么该语句的确切含义是什么以及它有何不同?ptr
const int *ptr=&i;
assignment of read-only location '*ptr'|
const
const int *ptr=&i;
int * const ptr=&i;
我把它钻进了我的脑海,这const int *ptr=&i;
意味着指针存储了一个常量的地址,而int * const ptr=&i;
意味着指针本身是常量并且不能改变。但是今天一位用户在讨论(链接)中告诉我const int *ptr means the memory pointed to must be treated as nonmodifiable _through this pointer_
。我发现这是一些新的东西因为这有点意思是“一些选择指针不能改变值(而其他人可以)”。我不知道这种选择性声明!!但是一个 180k 的老手证明了那个用户是正确的!!你也可以以更清晰、更详细和更严格的方式陈述这一点? `const int *ptr=&i; 到底是什么?意思是?
2)我还被告知,我们可以通过将非常量的地址分配给指针来欺骗语句中的程序。const int *ptr=&i;
这是什么意思?为什么允许我们这样做?为什么我们不会得到警告如果我们将非常量的地址分配给期望常量地址的指针ptr
?如果它对分配非常量的地址如此宽容,为什么当我们尝试更改非常量的值时会抛出错误- 常数,这是一个合理的做法,指出的变量是一个非常数?
#include <stdio.h>
int main ()
{
int i=8;
const int *ptr=&i;
*ptr=9;
printf("%d",*ptr);
}
错误: assignment of read-only location '*ptr'|