c-为什么我可以取消引用和修改“int*const”指针



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

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意味着:存储区域a0指向,在这种情况下为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;

相关内容

最新更新