struct Employee {}比较struct {} Employee

时间:2019-03-07 07:12:11

标签: c

我阅读了其中包含以下结构的教程:

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

定义一个名为Employee的新聚合,其中包含名为Name(字符类型),Age(整数类型)和SkillRating(float类型)的字段。

相反,C语句:

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

不定义新的聚合变量,而是定义新的聚合类型,   EmployeeType。   然后,可以使用这种新的数据类型在   与原始数据类型相同的方式。也就是说,就像C允许   使用语句将变量x声明为整数

我在这里很困惑。如果将“ Emplyee”放在不同的位置,是否存在区别?

我想它们是相同的。

3 个答案:

答案 0 :(得分:4)

在第一种情况下,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;
}

答案 1 :(得分:3)

struct A_s { int memb; }; // declares a struct A_s
struct A_s a; // declares a variable a of type struct A_s

现在您可以将struct声明与变量声明结合起来

// 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的类型为“ 25个字符的数组”,而不是字符类型。

答案 2 :(得分:1)

C中的

struct关键字可用于声明聚合数据类型,聚合数据对象或两者。

在您的第一个声明(和定义)中,缺少标签名称,因此创建了一个匿名对象“ Employee”。 “雇员”仍然是此结构的唯一对象。您无法在代码的其他任何地方从该结构创建更多对象。

在第二个声明中,您创建了一个可以实例化多次的struct类型(即,可以存在该st​​ruct的多个实例),如下所示-

struct EmployeeType employee_1;
struct EmployeeType employee_2;

根据使用情况,这两种语法都很有用。