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