基本类型只能表示单一的类型,但是如果要表示复杂的场景,比如说表示学生,其中包含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
网友评论