2011-05-03 88 views

回答

11

它将打印2. const int *b字面意思是:

指向一个整数,其值不能通过其dereferentiation被 改变。

这并不意味着指针指向的值可能不会改变。事实上,改变是完全有效的。一个可能的情况是使用这个结构,它保留对某个大型结构的只读引用。引用可能会改变,但使用该结构的函数可能不会改变指针后面的内容。

设想一个驱动程序或类似的东西,它发出设备交付的任何数据的只读存储器映射:映射的地址不是恒定的,但由于这是只读映射,用户程序可能无法写入它。 OTOH当设备更新数据时缓冲区的内容将会改变,但不一定是映射地址。

+0

非常可靠的解释是,你必须考虑一个事实,即指针对象本身就是一个地址。 – 2011-05-03 14:19:42

+0

这是我的情况:结构中的项目定义为指向const的指针,以便可以由其他函数更改数据。这是我第一次在这里,所有的答案都太快了! – misianne 2011-05-03 14:44:09

+0

@misianne:的确,当用这种方式指针时,“const”这个词有点让人误解,因为它让你思考const性(不变性),而它更像“readonly”。关键是,当你说'const int * p'时,你正在讲述**指针**(即它不能用于写入),而不是关于**指向的对象**(这可能不是不变)。 – 6502 2012-01-07 09:52:01

0

b自点,该值当然会改变。不知道你为什么还引入了c,但它没有添加任何东西。它将打印2

+0

即使b是常量而c不是? – BlackBear 2011-05-03 14:17:42

0

*b将是2,因为printf之前设置值的最后一行是*c = 2

a,bc都指向相同的整数值。所以最后一个设置它将决定它的当前值。

0

b在printf()中应该是2。你在b和c中一直处理一个指针。

0

声明const int *b = a;意味着b引用一个常量int值。也就是说它把它的价值看作一个不变的价值。

因此,

*b = 10; 

是不正确的,但:

a = 10; 

是罚款,因为一个是不是一个恒定值,但是提领b当我们把它当作常量。

c = 2; 

这是一样的上面的例子:

所以b,因为你改变了它指向的值肯定是定义。简而言之,指向const值的指针不能通过解引用来修改该值,但是指向的值可以另外进行更改。

2

标准说什么是(重点是我的)

6.7。3/5

如果试图修改通过使用与非 const限定型的左值与 一个常量限定类型定义的对象,该行为是未定义。

这不适用于您的情况(只是相反的方式)。
有问题的对象是用普通的(int)类型定义的。

在你的情况只有通过b更改对象是非法的;通过ac更改是完全合法的