文章目录
一、结构体的基本概念
C 语言是强类型语言。其数据类型可分为三大类:基本数据类型、指针相关类型、
扩展(或称复合)数据类型。[]数组类型、enum 枚举类型、struct 结构体类型、union
共用体类型就属于扩展的数据类型
二、 结构体的定义
struct 结构体名
{
类型 成员变量 1;
类型 成员变量 2;
....
};
比如定义一个学生信息
struct stu_info
{
unsigned stuID;//学号
char cardNum[20];//证件号码
char stuName[20];//学生姓名
char sex;//性别
};
这就是一个结构体数据类型。和枚举类型相似,属于扩展数据类型,可以把它和 int 等看做一个东西。
三、创建结构体变量
创建结构变量的方式有三种:
1.在 struct 类型描述完后,直接创建变量
例如:
struct stu_info
{
unsigned stuID;//学号
char cardNum[20];//证件号码
char stuName[20];//学生姓名
char sex;//性别
}s1,s2;
2.用结构体类型名创建变量,此时 struct 关键词不可少。
例如:
struct stu_info
{
unsigned stuID;//学号
char cardNum[20];//证件号码
char stuName[20];//学生姓名
char sex;//性别
};
struct stu_info s3, s4;
3.用 typedef 封装结构体类型并命名,可免除 struct 关键词来创建变量。
例如:
typedef struct stu_info
{
unsigned stuID;//学号
char cardNum[20];//证件号码
char stuName[20];//学生姓名
char sex;//性别
} Stu_info;
int main()
{
Stu_info s3, s4;
return 0;
}
四、结构体变量初始化赋值
由于结构体类型是由若干个成员变量构成的。因此赋值时要为每个成员变量单独赋值。具体细节如下。
1.结构体变量赋初始值。
初始值时的顺序与类型值要和成员定义的顺序保持一致。
struct stu_info
{
unsigned stuID;//学号
char cardNum[20];//证件号码
char stuName[20];//学生姓名
char sex;//性别
};
struct stu_info stu1 = { 001,"22222","王鹏",'男'};
这是一种方法,我们还可以指定结构体中的某一变量进行赋值:此时用 .引出具体成员名。
struct stu_info syu2 = { .stuName = "王鹏",
.cardNum = 232323,
.sex = '男',
.stuID = 002 };
2.单独给某一成员赋值
由于结构体变量就是一个大集合,里面由具体成员构成。当需要指明具体成员是需要用到“.”运算符,来表明“其中的 xxx”这个含义。
比如:
struct stu_info stu3;
stu3.sex = '女';
strcpy(stu3.cardNum, "123456");
strcpy(stu3.stuName, "王鹏");
stu3.stuID = 003;
为什么这里的学号和学生姓名不能直接赋值呢,我们前面介绍字符串时提到过,字符串名 相当于字符串的首地址,是一个指针常量,无法直接复制,所以要用 strcpy 来进行赋值。
五、结构体的键盘输入与输出
结构体变量在键盘输入时需要为每个成员单独的输入对应类型的数据,此时要注意数据类型的匹配。结构体成员如果是数组,由于数组名本身就是地址,所以可省略&取地址运算符。
比如:
struct stu_info s3;
scanf("%d %s %s %c", &s3.stuID
, s3.cardNum
, s3.stuName
, &s3.sex);
printf("%d %s %s %c", s3.stuID
, s3.cardNum
, s3.stuName
, s3.sex);
六、结构体数组
如下代码定义了一个图书信息的结构体类型——BOOK。并用该类型创建了一个数组
用于表达一个书架上的基本图书信息。
首先我们定义一个结构体:
typedef struct book
{
char bookName[20];
char author[20];
int year;
double price;
} BOOK;
接下来创建结构体数组变量
BOOK books[5] =
{ {"高等数学","佚名",2000,10},
{"活着","余华",1990,15.2},
{"浪潮之巅","吴军",2000,78},
{"毛选","毛泽东",1999,100},
{"三体","刘慈欣",2010,58} };
用调试器观察一下这个数组
我们发现这个数组中每个成员都是结构体 book 类型的变量,这样我们就定义了一个结构体数组。
七、结构体指针
首先创建一个结构体类型
typedef struct book
{
char bookName[20];
char author[20];
int year;
double price;
} BOOK;
接下来创建一个结构体指针类型:
typedef struct book
{
char bookName[20];
char author[20];
int year;
double price;
} BOOK,*P_BOOK;
此处的 P_BOOK 类型是在前面类型基础上增加的结构体指针类型。根据上面定义的结构体类型可以用如下三种方式创建结构体指针变量。
1、 使用结构体最原生的类型名称
struct book* p1;
2.使用 typedef 封装的结构体类型名称
BOOK* p2;
3.使用 typedef 封装的结构体指针类型名称
P_BOOK p3;
4.结构体指针成员访问运算符
.运算符用于结构体变量。使用“结构体变量.成员”的格式在整个结构体空间内使用其中的成员空间,是整体与局部的关系。而->非常形象的像个箭头,是结构体指针变量专用的运算符。用于结构体指针变量访问指向空间内的某个结构体成员空间。
BOOK b1 = {2008,65.0,"Pointer on C C 和指针","Reek"};
BOOK* pbook = &b1;
printf("%s\n", b1.bookName);
printf("%s\n", (*pbook).bookName);
printf("%s\n", pbook->bookName);