我知道指针有一个地址和内容单元格,其中包含一个地址。 那么下面代码中的指针会发生什么:
int a=5;
int* const ptr=&a;
*ptr=6;
ptr保持的地址没有改变,那么ptr指向的值如何改变?
答案 0 :(得分:5)
int *const ptr = &a;
此处ptr
是一个常量指针,因此您无法修改此指针指向的位置。但是您可以更改存储在指针指向的位置的值。
所以
*ptr = 6;
会将变量a
的值修改为6
。
不允许的是现有代码说你有
int b=5;
你做了
ptr = &b;
然后你肯定会得到一个错误,说明常量指针指向其他一些内存位置。
答案 1 :(得分:4)
如果您去图书馆并要求目录,那么使用目录找到一本书,然后用另一本书替换该书,目录仍然会在其中列出旧书。
类似的事情发生在您的代码中 - 指针(引用本身)不会改变,但指向的内容会发生变化。
如果您打算将对象指向const
,那么您需要将其声明为:
const int* ptr = &a;
或者,使对象和同时指针const
:
const int* const ptr = &a;
答案 2 :(得分:0)
内存中有一个4字节的区域,让我们说地址为0x2000,这个区域被称为" a"
使用指令a=5
,编译器(或更好的启动代码)使用4字节整数0x00000005(十进制为5)填充此存储区。
现在另一个变量ptr
填充了:ptr = 0x2000的地址。
指针包含内存区域a
的地址我们说ptr
指向a
*ptr
表示:内存区域ptr
指向,在本例中为0x2000内存。
所以最后*ptr=6
意味着整数/值6被填充到指向的内存区域ptr
。
现在0x2000的存储区将包含0x00000006(十进制6)
<小时/> 的修改
const
中的修饰符int* const ptr
表示实际的值即ptr
中的地址在程序执行过程中永远不会改变,它始终是指向/包含0x2000。
这意味着像
这样的作业ptr = &b;
将因编译器错误消息而失败。
答案 3 :(得分:0)
值可以改变,因为你所做的不变是指针指向的内容,而不是它内部的内容。
让我给你一个思考它的方法,这是一个很好的例证,但并不意味着文字。指针类型可以被视为无符号整数值(可能长度为32或64位,但现在并不重要)。实际上,所有存储在指针中的都是无符号整数或Nil,为了我们的目的,我们将调用&#34;零&#34;。
当你以这种方式将指针定义为常量时,你会做这通常意味着什么;这个变量的内容是不变的。因此,填充到这个无符号整数中的数字不会改变。
但是,当使用(或取消引用)指针时,它们的特殊之处在于指针的值用于引用另一个内存位置。那个位置只是另一个变量。由于您的赋值不会更改实际指针本身,因此它完全有效。 :)
答案 4 :(得分:0)
这里指针ptr
是常量类型。一旦加载了地址,常量指针就不能改变地址。
在第三行*ptr=6;
中,您将值分配给存储在ptr
pointer.ie.to a
中的地址。因此,只有a
的值更改为6。
要更改ptr
的地址,请删除关键字const
并指定一个类似ptr=&b
的地址
答案 5 :(得分:0)
这里指针是一个常量类型,使用该指针只能指向单个内存地址。现在,您无法使用此指针
指向另一个地址int a,c;
int *const b=&a;
当我们像这样分配时,它是通过错误
b=&c;