我認爲我讀過某處在C中枚舉值爲的地址是非法的(枚舉值不是左值;但是,我找不到任何信息這現在)。這是否正確?如果是這樣,爲什麼?枚舉值的內存位置在C
編輯:
下面是一個例子來闡明我的意思是「枚舉值」上面。我的意思是考慮下面的first_value
地址,而不是採取一個枚舉的實際實例的地址:
enum myenum
{
first_value,
second_value
};
我認爲我讀過某處在C中枚舉值爲的地址是非法的(枚舉值不是左值;但是,我找不到任何信息這現在)。這是否正確?如果是這樣,爲什麼?枚舉值的內存位置在C
編輯:
下面是一個例子來闡明我的意思是「枚舉值」上面。我的意思是考慮下面的first_value
地址,而不是採取一個枚舉的實際實例的地址:
enum myenum
{
first_value,
second_value
};
「枚舉值」稍微含糊不清;不過,我想你指的是以下幾點:
enum myenum
{
first_value,
second_value
};
在這種情況下,它是違法的first_value
地址。原因是first_value
實際上並不存在於任何地方的內存中......它只是一個常數,實際上是數字0的另一個名稱(當然,您也不能接收該地址)。
如果,另一方面,你的意思是你是否可以採取被聲明爲枚舉變量的地址:
enum myenum x;
enum myenum *mypointer=&x;
那麼這是絕對有可能。
如果您有:
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;
}
枚舉的值名稱只是整數的常量別名,因此嘗試獲取它們的地址是沒有意義的。當然,你可以把enum 變量的地址當成很好。
枚舉值是常量,但它們不是宏。在大多數方面,它們當然與使用宏定義的常量類似,但它們在某些微妙方面不同 - 例如,它們受範圍限制,而宏不是。 – 2009-07-30 13:32:57
它們當然不是#defines或宏。您可能需要對此進行重新說明。 – 2009-07-30 13:33:24
是的,耶穌,我非常低估了我會遇到的腳步。最大限度地減少廢物。現在好多了。 – chaos 2009-07-30 13:35:16
據我記得在C中的枚舉只是整數。 所以它會像指向局部變量。
枚舉用於替換#define
鏈:
#define SUCCESS 0
#define LITTLE_ERROR 1
#define BIG_ERROR 2
這可以被替換:
enum
{
SUCCESS,
LITTLE_ERROR,
BIG_ERROR
};
的枚舉值如SUCCESS
僅僅是用於一個整數常數的符號,從而贏得」不要存儲在程序內存中的任何地方。因此,採取它的地址是沒有意義的。
請參考下面的例子:
enum { FIRST,SECOND } var;
這裏FIRST
和SECOND
是恆定的宏。因此,&
運營商將無法工作,因爲它不存儲在內存中的任何位置
但是對於var
將分配一個內存位置,並且可以使用&
運算符。
該枚舉只存在於編譯器的內存中,而不是可執行的。您必須創建一個枚舉實例才能顯示在可執行文件中。 – Anonym 2010-01-13 12:24:09