结构体

2020-08-28  本文已影响0人  牧_青

  基本类型只能表示单一的类型,但是如果要表示复杂的场景,比如说表示学生,其中包含id,name,age这是就不能用某个基本类型来表示。为此,C语言引入了结构体的概念。

1、普通结构体的声明,定义和使用

1.1、声明

  在使用结构体之前,需要先声明它。一般形式为:

struct struct_name {
    类型说明符 成员名;        // 每个成员变量都有分号(;)作为结尾
    类型说明符 成员名;
    ...;
};         // 结构体最后用分号表示结束
# exam:
struct stu {
    int id;
    char *name;
    int age;
};

1.2、定义

  声明了结构体之后,系统并没有为这个结构体分配内存空间,如果需要对这个结构体进行赋值等运算,需要为这个结构体定义变量。
  定义结构体变量一般有三种方式:
   1. 先声明,再定义
   2. 声明的同时定义变量(包括结构体名称)
   3. 声明的同时定义变量(省略结构体名称)

# 先声明,在定义
struct stu {
    int id;
    char *name;
    int age;
};
struct stu student1, student2;   // 需要注意,此处struct不能省略

# 声明时直接定义变量(包括结构体名称)
struct stu {
    int id;
    char *name;
    int age;
} student1, student2;

# 声明时直接定义变量(省略结构体名称)
struct {
    int id;
    char *name;
    int age;
} student1, student2;     //注意这种和第二种的区别

  此外,可以直接使用宏定义#define使用一个符号常量来表示一个结构体类型,其用法也和上面类似。

#define Stu struct stu
Stu {
    int id;
    char *name;
    int age;
};
Stu student1, student2;

1.3、使用

  c语言通常不会讲一个结构体变量当成一个完成的变量来使用,除了允许相同类型的结构体相互赋值之外,对其的赋值,输入,输出, 运算等都是通过结构体成员变量来实现的(所以别老想着像go语言一样对结构体整个输出)。

1.3.1、成员表示

  结构体成员的表示通常有两种方式:
  1. 结构体变量名.成员名
  2. 结构体指针->成员名

student1.id = 1;
student2.id = 2;

1.3.2、结构体变量赋值

  如前所说,除了类型相同的结构体之间可以相互赋值外,结构体的赋值操作都是通过结构体的成员变量来实现的。除此之外,结构体变量在定义的时候可以进行整体赋值。
  所以说,结构体变量赋值有三种:
  1. 针对结构体的每个成员变量进行赋值
  2. 对于相同结构体,可以直接相互赋值
  3. 结构体变量如果在定义时赋值,可以进行整体赋值(需要注意,如果先定义,再赋值,就不能进行整体赋值)

struct stu {
    int id;
    char *name;
    int age;
} student1, student2, student3 = {3, "xiaohong", 18};  //  声明时定义变量进行整体赋值
// 针对每个成员变量进行赋值
student1.id = 1;
student1.name = "xiaoming";
student1.age = 18;

// 相同结构体变量之间进行赋值
student2 = student1;

// 定义变量时进行赋值
stu student4 = {4, "xiaolan", 18};
// 需要注意,以下做法是错误的
// stu student5
// student5 = {5, "xiaohuang", 18};   //error: expected expression   student5 = {5, "xiaohuang", 18}; 

1.4、结构体数组

  数组的元素也可以是结构体类型,用来表示相同数据结构的一个群体。
  结构体数组的定义方式和结构体变量定义相似,只需要说明它是数据类型即可。

struct {
    int id;
    char *name;
    int age;
}student[2]= {
    {1, "xiaoming", 18};
    {2, "xiaohuang", 18};
};    //此处如果对数组中的所有成员赋值,也可不给出数组长度。

留坑待填~

1.5、结构体指针

1.5.1、指向结构体的指针

1.5.2、结构体指针作为函数参数

1.6、动态分配存储

l

上一篇 下一篇

猜你喜欢

热点阅读