Почему мы оставляем некоторые структурные переменные из фигурных скобок?

Я пытаюсь понять struct в C. Я не мог понять идею этого определения ниже. Почему мы оставляем aCard, deck[ ] и *cardPtr? В чем разница между их включением и отсутствием?

 struct card {
    char *face;
    char *suit;
 } aCard, deck[52], *cardPtr;

Ответ 1

Хотя, этот вопрос уже ответил, я отправляю свой ответ, потому что я думаю, что у ОП есть сомнения в объявлении структуры и определении переменной типа структуры.

Если вы не знаете, что такое структура на C, ознакомьтесь с 1) ниже.

Ключевое слово struct представляет объявление структуры, которое представляет собой список объявлений, заключенных в фигурные скобки. Необязательное имя, называемое тегом структуры, может следовать за словом struct. Следовательно, это объявление структуры:

struct card {
    char *face;
    char *suit;
 };

здесь face и suit являются переменными-членами. Обратите внимание, что декларация структуры не резервирует память; он просто описывает шаблон структуры.

Объявление структуры определяет тип. За правой скобкой, которая завершает список членов, может следовать список переменных. Итак, в вашем случае:

....
} aCard, deck[52], *cardPtr;

aCard, deck[52] и *cardPtr являются переменными типа struct card.

Поскольку ваша структура декларация помечается имя card, тег card может быть использована в дальнейшем в определениях экземпляров структуры. например, учитывая объявление структурной card выше,

struct card someCard;

определяет переменную someCard которая является структурой типа struct card.

Кроме того, вы можете typedef объявление структуры и использовать его для определения переменных своего типа.


1)

По определению - структура представляет собой совокупность одной или нескольких переменных, возможно, разных типов, сгруппированных вместе под одним именем.

Согласно стандарту С# 6.2.5 [Типы]:

Тип структуры описывает последовательно выделенный непустой набор объектов-членов (и, в определенных случаях, неполный массив), каждый из которых имеет необязательно указанное имя и, возможно, отдельный тип.

.....
...
Арифметические типы и типы указателей в совокупности называются скалярными типами. Типы массивов и структуры совместно называются совокупными типами.46)

Ответ 2

Вы смешиваете вещи. struct card имеет face и suit. Но есть три переменные, использующие тип struct card, а именно aCard, deck, cardPtr.

В качестве альтернативы можно было написать:

typedef struct {
    char *face;
    char *suit;
} Card;

Card aCard, deck[52], *cardPtr;
// or even
Card aCard;
Card deck[52];
Card *cardPtr;

Для typedef смотрите: Почему мы должны набирать структуру так часто в C? (Он входит в typedef struct {... } Foo; vs struct Foo {...}).

Ответ 3

Ваша часть кода может быть написана следующим образом:

struct card {          // define the struct card
    char *face;
    char *suit;
 };

struct card aCard;     // declare a variable "aCard" of type "struct card "
struct card deck[52]   // declare an array of 52 variables of type "struct card"
struct card *cardPtr;  // declare a variable "cardPtr" of type "pointer to struct card"

Ответ 4

struct card {
    char *face;
    char *suit;
 }

как int, но определяется пользователем, и

aCard, deck[52], *cardPtr;

являются именами переменных, например,

int aCard, deck[41], *cardPtr;

Ответ 5

Вы указали три переменные. aCard имеет тип struct card, deck имеет тип struct card[52] а cardPtr имеет тип struct card *

Ответ 6

aCard и остальное, о которых вы упомянули, являются переменными типа struct card и каждая из этих переменных содержит char *face и char *suit. Итак, как может какая-то переменная может содержать себя, т.е. aCard находится внутри узла struct.