在C语言中,常量不能使用&运算符。

5
根据Kernighan和Ritchie的《C程序设计语言》,第94页,&运算符不能用于常量。
const int u = 9;
printf ("\nHello World! %u ", &u);

那么,为什么会奏效呢?

通常情况下,u用于无符号整数... - ΦXocę 웃 Пepeúpa ツ
4
书中所说的常量是指“字面常量”,即在代码中直接出现的不可变值。即使一个变量被标记为const,它仍然是一个变量。 - Some programmer dude
1
"constant" 和 "const 限定的变量" 是不同的。 - M.M
1
作为一个提示,请对 lvaluesrvalues 进行一些研究。 - Some programmer dude
3个回答

6
你误解了C语言中的常量和const关键字。它们是不同的概念。
&运算符不能应用于常量。
在C编程中,这意味着你不能使用&(地址运算符)获取字面常量的地址。
举个例子:
&10 

或者

&('a')

如果你在文字常量上使用 & 运算符,编译器会报错,因为常量实体没有相应的地址。

'a' 也是一个整型常量。 - mch

1
根据草案标准§6.5.3.2 ¶1,地址操作符的使用必须遵守以下约束:
引用操作符&的操作数必须是函数设计者、[]或一元*操作符的结果,或指定了一个不是位域且未声明为register存储类别说明符的对象的lvalue。 lvalue的含义在§6.3.2.1 ¶1中给出: lvalue是一个表达式(具有非void对象类型),可能指定一个对象。
根据§3.15 ¶1对象是执行环境中的数据存储区域,其内容可以表示值。
现在,常量不是左值;常量具有值,但常量不表示对象,值不能被赋给常量。因此,常量不是函数设计ator,不是[]或一元*运算符的结果,也不是左值,这意味着取常量的地址是一个约束违规。符合规范的实现必须发出诊断消息。
另一方面,考虑到const int u = 9;u是一个类型为intconst限定变量。这个声明确实为该变量保留了存储空间,并且u是一个左值。使用const并不表示u是一个常量,而是表示由标识符u指示的对象是const的(这并不相同)。将const限定变量视为“只读”可能更好;这是程序所做的承诺,即由u指示的对象不会被修改。由于u在这里是一个左值(它不是位域,并且没有用register关键字声明),因此使用&u获取其地址是可以的。
请注意,发布的代码具有未定义行为,因为打印地址的正确printf()转换说明符是%p;其参数必须转换为(void *)。不匹配的转换说明符和参数会导致未定义的行为。因此,正确的代码应该是:
const int u = 9;
printf ("\nHello World! %p ", (void *) &u);

0
不,为了获取变量在内存中的地址,我们可以将指针应用于其中任何一个,因为CPU为它们分配了内存。另一方面,这个问题已经被问过了。
C语言中,“常量”一词确实只表示字面常量,比如2。const限定的对象在C术语中并不是“常量”。 问题链接

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接