为什么我可以取消引用并修改'int*const'指针?

为什么我可以取消引用并修改'int*const'指针?,c,pointers,C,Pointers,我知道指针有一个地址和内容单元,其中包含一个地址。 那么,以下代码中的指针会发生什么变化: int a=5; int* const ptr=&a; *ptr=6; ptr持有的地址没有更改,那么ptr指向的值如何更改 int *const ptr = &a; 此处ptr是一个常量指针,因此您无法修改该指针指向的位置。但是您可以更改存储在指针指向的位置中的值 所以 将变量a的值修改为6 不允许的是您所拥有的现有代码 int b=5; 你呢 ptr = &b; 然后,

我知道指针有一个地址和内容单元,其中包含一个地址。 那么,以下代码中的指针会发生什么变化:

int a=5;
int* const ptr=&a;
*ptr=6;

ptr持有的地址没有更改,那么ptr指向的值如何更改

int *const ptr = &a;
此处
ptr
是一个常量指针,因此您无法修改该指针指向的位置。但是您可以更改存储在指针指向的位置中的值

所以

将变量
a
的值修改为
6

不允许的是您所拥有的现有代码

int b=5;
你呢

ptr = &b;

然后,您肯定会得到一个错误,表示常量指针指向其他内存位置。

内存中有一个4字节的区域,比如在地址0x2000处,该区域称为“a”

使用指令
a=5
编译器(或更好的启动代码)用4字节整数0x00000005(十进制数为5)填充该内存区域

现在,另一个变量ptr用地址a:ptr=0x2000填充

指针包含存储区
a
的地址,我们说
ptr
指向
a

*ptr
表示:内存区
ptr
指向,在本例中为0x2000处的内存

因此,最后
*ptr=6
意味着整数/值6被填充到内存区域
ptr
指向

现在0x2000处的内存区域将包含0x00000006(十进制6)


编辑

int*const ptr
中的修饰符
const
意味着实际值,即
ptr
中的地址在程序执行过程中永远不会改变,它将始终指向/包含0x2000

这意味着像这样的任务

ptr = &b;

将失败,并显示一条编译器错误消息。

如果您去图书馆索要目录,然后使用目录查找一本书,然后用另一本书替换该书,目录仍将列出其中的旧书

在代码中也会发生类似的事情-指针(引用本身)不会改变,但它指向的内容会改变

如果要使对象指向
const
,则需要将其声明为:

const int* ptr = &a;
或者,要使对象都成为指针
常量

const int* const ptr = &a;

该值可以更改,因为使其成为常量的是指针指向的对象,而不是指针内部的对象

让我给你们一个思考的方式,这是一个很好的说明,但不是字面意思。指针类型可以被视为无符号整数值(长度可能为32或64位,但现在这并不重要)。实际上,所有存储在指针中的数据都是无符号整数或Nil,我们称之为“零”

当您以这种方式将指针定义为常量时,您将执行通常的操作;此变量的内容是常量。所以填充到这个无符号整数中的数字不会改变


但是,当使用(或取消引用)指针时,它们的特殊之处在于指针的值用于引用另一个内存位置。那个位置只是另一个变量。由于您的赋值不会更改实际指针本身,因此它是完全有效的。:)

此处指针
ptr
为常量类型。常量指针加载地址后无法更改地址

第三行
*ptr=6
您正在将值分配给存储在
ptr
指针中的地址,即to
a
。因此,只有
a
的值更改为6。
要更改
ptr
的地址,请删除关键字
const
,并指定一个地址,如
ptr=&b

此处指针是常量类型,使用该指针,您只能指向单个内存地址。现在您不能使用此指针指向另一个地址

int a,c;
int *const b=&a;
当我们像这样被分配时,它是通过错误的

 b=&c;

同样,房屋出售后,街道地址不会改变,新居民也会搬进来。相同的房子,不同的居民。你实际上想要的是
const int*ptr=&a或可能
const int*const ptr=&a“ptr持有的地址没有改变,所以ptr指向的值如何才能改变”–确切地说。它们是正交的。指针所持有的地址与它指向的对象的内容无关。因此,实际上$const int*ptr$可以通过另一个具有其他值的变量的赋值和地址来更改?在C中,我们人类需要从右到左读取变量声明,以清楚地理解“const”修饰符是什么你说的是不变的。所以,'int*const ptr=&a;'可以理解为“ptr是常数*到整数”。也就是说指针是常量。稍微重新排序:“const int*ptr=&a;”可以理解为“ptr是指针int const”。表示ptr可以更改,但它所指向的int不能更改。最后,'const int*const ptr=&a;'可以理解为“ptr是指向int const的常量指针”。也就是说,指针和所指向的int都不能更改。您能否说明
常量的用途,以及为什么它不能阻止赋值?
 b=&c;