我想我已经在某处读过在C中获取枚举值的地址是非法的(枚举值不是左值;但是,我现在找不到任何关于此的信息)。这是正确的,如果是的话,为什么?
编辑:
这是一个通过上面的“枚举值”澄清我的意思的例子。我的意思是取下面first_value
的地址,而不是获取枚举的实际实例的地址:
enum myenum
{
first_value,
second_value
};
答案 0 :(得分:26)
“枚举值”略显模糊;但是,我认为你的意思是:
enum myenum
{
first_value,
second_value
};
在这种情况下,取first_value
的地址是违法的。原因是first_value
实际上并不存在于内存中......它只是一个常数,实际上是数字0的另一个名称(当然,你也不能取地址)。 / p>
另一方面,如果你的意思是你是否可以获取声明为枚举的变量的地址:
enum myenum x;
enum myenum *mypointer=&x;
那绝对是可能的。
答案 1 :(得分:18)
如果你有:
enum E {
X, Y, Z
};
那么你不能取X,Y或Z的地址,只能取0,1或2的地址。
但是,您可以获取枚举实例的地址:
typedef enum {
X, Y, Z
} E;
int main() {
E e;
E * ep;
ep = & e;
}
答案 2 :(得分:10)
枚举用于替换#define
个链:
#define SUCCESS 0
#define LITTLE_ERROR 1
#define BIG_ERROR 2
这可以替换为:
enum
{
SUCCESS,
LITTLE_ERROR,
BIG_ERROR
};
诸如SUCCESS
之类的枚举值仅仅是整数常量的符号,它不会存储在程序存储器的任何位置。因此,取其地址是没有意义的。
答案 3 :(得分:5)
枚举的值名称只是整数的常量别名,因此尝试获取其地址毫无意义。当然,您可以将枚举变量的地址设置得很好。
答案 4 :(得分:2)
请参考以下示例:
enum { FIRST,SECOND } var;
此处FIRST
和SECOND
是常量宏.Hence &
运算符无效,因为它不存储在内存中的任何位置
但是对于var
,将分配一个内存位置,并且可以使用&
运算符。
答案 5 :(得分:0)
据我记得,C中的枚举只是整数。 所以它就像指向局部变量。