C中枚举值的内存位置

时间:2009-07-30 13:23:11

标签: c memory pointers

我想我已经在某处读过在C中获取枚举值的地址是非法的(枚举值不是左值;但是,我现在找不到任何关于此的信息)。这是正确的,如果是的话,为什么?


编辑:

这是一个通过上面的“枚举值”澄清我的意思的例子。我的意思是取下面first_value的地址,而不是获取枚举的实际实例的地址:

enum myenum
{
    first_value,
    second_value
};

6 个答案:

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

此处FIRSTSECOND是常量宏.Hence &运算符无效,因为它不存储在内存中的任何位置

但是对于var,将分配一个内存位置,并且可以使用&运算符。

答案 5 :(得分:0)

据我记得,C中的枚举只是整数。 所以它就像指向局部变量。