为什么我可以取消引用并修改'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
指针中的地址,即toa
。因此,只有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;