Подтвердить что ты не робот

Расположение памяти значения enum в C

Мне кажется, что я где-то читал, что незаконно принимать адрес значения enum в C (значения enum не являются lvalues, однако я не могу найти информацию об этом сейчас). Это правильно и, если да, то почему?


Edit:

Вот пример, который разъясняет, что я имею в виду под "значением перечисления" выше. Я имею в виду адрес ниже first_value, не принимая адрес фактического экземпляра перечисления:

enum myenum
{
    first_value,
    second_value
};
4b9b3361

Ответ 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 являются целыми числами. Таким образом, это будет похоже на локальную переменную.