根据Kernighan和Ritchie的《C程序设计语言》,第94页,&运算符不能用于常量。
那么,为什么会奏效呢?
const int u = 9;
printf ("\nHello World! %u ", &u);
那么,为什么会奏效呢?
const int u = 9;
printf ("\nHello World! %u ", &u);
&10
或者
&('a')
&
运算符,编译器会报错,因为常量实体没有相应的地址。'a'
也是一个整型常量。 - mch[]
或一元*
运算符的结果,也不是左值,这意味着取常量的地址是一个约束违规。符合规范的实现必须发出诊断消息。const int u = 9;
,u
是一个类型为int
的const
限定变量。这个声明确实为该变量保留了存储空间,并且u
是一个左值。使用const
并不表示u
是一个常量,而是表示由标识符u
指示的对象是const
的(这并不相同)。将const
限定变量视为“只读”可能更好;这是程序所做的承诺,即由u
指示的对象不会被修改。由于u
在这里是一个左值(它不是位域,并且没有用register
关键字声明),因此使用&u
获取其地址是可以的。printf()
转换说明符是%p
;其参数必须转换为(void *)
。不匹配的转换说明符和参数会导致未定义的行为。因此,正确的代码应该是:const int u = 9;
printf ("\nHello World! %p ", (void *) &u);