为什么我能解除引用并修改`int * const`指针?

时间:2015-03-24 11:03:12

标签: c pointers

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

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

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

6 个答案:

答案 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;