结构体声明、定义和初始化的几种方式

  • Post author:
  • Post category:其他




五种结构体声明方式:

  • 直接声明结构体类型
  • 声明结构体类型的同时定义结构体变量
  • 不指定结构体名而直接定义结构体变量
  • 使用结构体标记和类型别名
  • 直接声明结构体别名


在C语言中,标记(tag)是在定义

struct

, union或enum关键字之后使用的标识符。

之所以称其为结构体的“tag”而不是“name”,是因为在C语言中,仅使用 tnode 不会指向该结构体(标记为tnode的struct),而需要用 struct tnode。


结构体的声明及定义:

// 直接定义结构体类型
struct student{
    char no[20];       //学号
    char name[20];    //姓名
    char sex[5];      //性别
    int age;          //年龄
};
struct student stu3;

// 定义结构体类型的同时定义结构体变量
struct student{
    char no[20];      //学号
    char name[20];    //姓名
    char sex[5];      //性别
    int age;          //年龄
} stu1,stu2;
struct student stu3;

// 不指定结构体名而直接定义结构体变量
struct{
    char no[20];        //学号
    char name[20];      //姓名
    char sex[5];      //性别
    int age;          //年龄
} stu1,stu2; 
// 直接定义结构体变量stu1、stu2之后,就不能再继续定义该类型的变量

// 使用结构体标记和类型别名
typedef struct student{
    char no[20];       //学号
    char name[20];    //姓名
    char sex[5];      //性别
    int age;          //年龄
}student_t;
student_t stu1,stu2;  //此时stu1,stu2为student结构体变量
struct student stu3;

// 直接定义结构体别名
typedef struct{
    char no[20];       //学号
    char name[20];    //姓名
    char sex[5];      //性别
    int age;          //年龄
}student_t;
student_t stu1,stu2; // 只能使用这种方式


有typedef 和无typedef 关键字的区别在于,第一种方式将结构体标记和类型别名定义在一起,可以更方便地使用别名来代替结构体类型;

而第二种方式直接定义结构体类型,不需要定义结构体标记,但需要使用

struct

关键字来引用结构体类型。

无论采用哪种方式,定义的结构体类型本质上都是相同的,它们都有相同的结构体成员,并且可以通过别名来使用结构体类型。

需要注意的是,


如果结构体类型没有设置类型别名,则必须在定义变量时使用结构体标记来指定变量的类型,而不能使用类型别名。


另外,如果结构体类型定义在函数内部,则只能在函数内部使用该结构体类型。



版权声明:本文为zpf1813763637原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。