2009-07-30 44 views
11

我認爲我讀過某處在C中枚舉值爲的地址是非法的(枚舉值不是左值;但是,我找不到任何信息這現在)。這是否正確?如果是這樣,爲什麼?枚舉值的內存位置在C


編輯:

下面是一個例子來闡明我的意思是「枚舉值」上面。我的意思是考慮下面的first_value地址,而不是採取一個枚舉的實際實例的地址:

enum myenum 
{ 
    first_value, 
    second_value 
}; 
+0

該枚舉只存在於編譯器的內存中,而不是可執行的。您必須創建一個枚舉實例才能顯示在可執行文件中。 – Anonym 2010-01-13 12:24:09

回答

24

「枚舉值」稍微含糊不清;不過,我想你指的是以下幾點:

enum myenum 
{ 
    first_value, 
    second_value 
}; 

在這種情況下,它是違法的first_value地址。原因是first_value實際上並不存在於任何地方的內存中......它只是一個常數,實際上是數字0的另一個名稱(當然,您也不能接收該地址)。

如果,另一方面,你的意思是你是否可以採取被聲明爲枚舉變量的地址:

enum myenum x; 
enum myenum *mypointer=&x; 

那麼這是絕對有可能。

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; 
} 
5

枚舉的值名稱只是整數的常量別名,因此嘗試獲取它們的地址是沒有意義的。當然,你可以把enum 變量的地址當成很好。

+0

枚舉值是常量,但它們不是宏。在大多數方面,它們當然與使用宏定義的常量類似,但它們在某些微妙方面不同 - 例如,它們受範圍限制,而宏不是。 – 2009-07-30 13:32:57

+0

它們當然不是#defines或宏。您可能需要對此進行重新說明。 – 2009-07-30 13:33:24

+0

是的,耶穌,我非常低估了我會遇到的腳步。最大限度地減少廢物。現在好多了。 – chaos 2009-07-30 13:35:16

0

據我記得在C中的枚舉只是整數。 所以它會像指向局部變量。

10

枚舉用於替換#define鏈:

#define SUCCESS 0 
#define LITTLE_ERROR 1 
#define BIG_ERROR 2 

這可以被替換:

enum 
{ 
    SUCCESS, 
    LITTLE_ERROR, 
    BIG_ERROR 
}; 

的枚舉值如SUCCESS僅僅是用於一個整數常數的符號,從而贏得」不要存儲在程序內存中的任何地方。因此,採取它的地址是沒有意義的。

2

請參考下面的例子:

enum { FIRST,SECOND } var; 

這裏FIRSTSECOND是恆定的宏。因此,&運營商將無法工作,因爲它不存儲在內存中的任何位置

但是對於var將分配一個內存位置,並且可以使用&運算符。