struct Employee {} сравнить struct {} Employee - PullRequest
2 голосов
/ 07 марта 2019

Я прочитал учебник, в котором есть эта структура:

struct
{
    char Name[25];
    int Age;
    float SkillRating;
} Employee;

определяет новый агрегат с именем Employee, содержащий поля с именем Name (типа символа), Age (типа integer)и SkillRating (типа float).

Напротив, оператор C:

struct EmployeeType
{
    char Name[25];
    int Age;
    float SkillRating; 
};

не определяет новую статистическую переменную, но определяет новый тип агрегирования EmployeeType.Этот новый тип данных может затем использоваться для объявления переменных так же, как примитивный тип данных.То есть точно так же, как C позволяет объявлять переменную x как целое число, используя оператор

Я запутался здесь.Существует ли различие, если поместить «Emplyee» в другую позицию?

Я думаю, они идентичны.

Ответы [ 3 ]

4 голосов
/ 07 марта 2019

В первом случае struct является безымянным, а Employee является переменной этой безымянной структуры.Вы можете напрямую изменить его следующим образом:

int main()
{
    Employee.Age = 100;
    return 0;
}

Во втором случае EmployeeType - это просто тип, но вы еще не сделали ни одного экземпляра.Вы можете сделать любое количество экземпляров:

int main()
{
    struct EmployeeType a;  // employee on the stack
    a.Age = 100;
    struct EmployeeType *b = malloc(sizeof(struct EmployeeType)); // employee on the heap
    if (b) { // set the age of b if the allocation succeeded
        b->Age = 100;
    }
    free(b); // malloc-allocated memory must be freed afterwards 
    return 0;
}

Вы можете даже сделать и то и другое одновременно:

struct EmployeeType
{
    char Name[25];
    int
        Age;
    float SkillRating;
} Employee;

Здесь Employee является одним его экземпляром, но вы можете сделать дополнительныеэкземпляры:

int main()
{
    Employee.Age = 100;
    struct EmployeeType a;  // employee on the stack
    a.Age = 100;
    return 0;
}
3 голосов
/ 07 марта 2019
struct A_s { int memb; }; // declares a struct A_s
struct A_s a; // declares a variable a of type struct A_s

теперь вы можете комбинировать объявление структуры с объявлением переменной:

// declares struct A_s and in the same line declares variable a
struct A_s { int memb; } a; 

Теперь вы можете создать анонимную структуру, пропустив имя тега структуры:

// declares anonymous struct and in the same line declares variable a
struct { int memb; } a;

Теперь объявление структуры можно поместить куда угодно:

int func(int a, struct A_s { int memb; } b);
struct A_s { int memb; } func(int a);
struct B_s {
    int memb1;
    struct A_s {
         int memb2;
    } a;
};

Я думаю, что описание кода C поля "name" в вашем посте недействительно. Поле name внутри «агрегата» (читается как: структура) имеет тип «массив из 25 символов», а не тип символа.

1 голос
/ 07 марта 2019

struct ключевое слово в C может использоваться для объявления типов агрегированных данных, объектов агрегированных данных или обоих.

В вашем первом объявлении (и определении) отсутствует имя тега, поэтому анонимный объект 'Employee' создано.«Сотрудник» остается единственным объектом этой структуры.Вы не можете создавать больше объектов из этой структуры где-либо еще в коде.

Во втором объявлении вы создали тип структуры, который может быть создан много раз (т. Е. Может существовать несколько экземпляров этой структуры), как показанониже -

struct EmployeeType employee_1;
struct EmployeeType employee_2;

Оба эти синтаксиса полезны в зависимости от варианта использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...