Расположение памяти значения enum в C
Мне кажется, что я где-то читал, что незаконно принимать адрес значения enum в C (значения enum не являются lvalues, однако я не могу найти информацию об этом сейчас). Это правильно и, если да, то почему?
Edit:
Вот пример, который разъясняет, что я имею в виду под "значением перечисления" выше. Я имею в виду адрес ниже first_value
, не принимая адрес фактического экземпляра перечисления:
enum myenum
{
first_value,
second_value
};
Ответы
Ответ 1
"Значение перечисления" немного неоднозначно; однако, я полагаю, вы имеете в виду следующее:
enum myenum
{
first_value,
second_value
};
В этом случае незаконно принимать адрес first_value
. Причиной этого является то, что first_value
на самом деле не существует в памяти где угодно... это просто постоянное, фактически другое имя для числа 0 (из которого, конечно, вы также не можете взять адрес).
Если, с другой стороны, вы имеете в виду, можете ли вы принять адрес переменной, объявленной как перечисление:
enum myenum x;
enum myenum *mypointer=&x;
то это определенно возможно.
Ответ 2
если у вас есть:
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;
}
Ответ 3
Переменные используются для замены цепей #define
:
#define SUCCESS 0
#define LITTLE_ERROR 1
#define BIG_ERROR 2
Это можно заменить на:
enum
{
SUCCESS,
LITTLE_ERROR,
BIG_ERROR
};
Значение перечисления, такое как SUCCESS
, является просто символом целочисленной константы, которая не хранится нигде в памяти программы. Таким образом, нет смысла принимать его адрес.
Ответ 4
Имена значений для перечислений - это просто постоянные псевдонимы для целых чисел, поэтому бессмысленно пытаться принять их адрес. Разумеется, вы можете взять адрес переменной enum.
Ответ 5
pls ссылаются на пример ниже:
enum { FIRST,SECOND } var;
здесь FIRST
и SECOND
являются постоянными макросами. Оператор &
не работает, поскольку он не хранится нигде в памяти
Но для var
будет назначена ячейка памяти и может использоваться оператор &
.
Ответ 6
Насколько я помню, перечисления в C являются целыми числами.
Таким образом, это будет похоже на локальную переменную.