C语言之数据结构(DAY31)

发布时间:2023年12月17日

一、引用结构体的场景

问题:学籍管理,记录下每个学生的姓名、学号、性别、年龄、分数、地址,

你也许会定义姓名为char型变量、学号为int型变量、性别为char型变量……但是这些变量都是相互独立的,无法将它们联系起来,那怎么样能把这些数据存放在一起呢?

而C语言,允许用户自己建立不同数据类型组合而成的结构型数据,而这个结构型数据称为结构体。组成结构型数据的各个数据,称为结构体的成员

通俗来说:结构体就是用户自己定义的数据结构,允许用户在里面存储不同的数据类型。

二、结构体的声明

声明结构体的一般形式:

struct 结构体名

{

成员表列

};

注意:最后有一个分号

对上述学籍管理的问题,声明一个结构体

struct student //结构体类型名为student
{
    char nam[20];//姓名定义为字符串变量
    int num;//学号定义为整型变量
    char sex;//性别定义为字符变量
    float score;//分数定义为实型变量
    char address[30];//地址定义为字符串变量
};

三、定义结构体类型变量

1.先声明结构体类型,再定义该类型的变量

如上面的程序已经定义了结构体类型名,就可以用它来定义变量。

例如:

struct student student1,student2;结构体变量名为student1和student2

声明结构体类型就是为了后续定义结构体类型变量时,让系统对之分配存储单元。

声明结构体类型就相当于建造一个房子的大框架,定义结构体变量就相当于在房子里摆物件。

根据成员的数据类型,32位的系统会为student1分配一个63个字节的存储单元(20+4+1+8+30=63)。

2.在声明类型的同时定义变量

例如:

struct student 
{
    char nam[20];
    int num;
    char sex;
    float score;
    char address[30];
}student1,student2;

这种定义方法的一般形式:

struct 结构体名

{成员表列

}变量名表列;

这种方法适合用于写小程序,能直观地看见结构体的结构;但在写大程序时,往往要求对结构类型的声明和对变量的定义分开,声明完类型,可以随时定义变量,便于后续维护。

四、结构体变量的初始化

1.在定义结构体变量时,可以对它的成员进行初始化。

例如:

struct student 
{   int num;
    char nam[20];
    char sex;
    float score;
    char address[30];
}student1 = { 10101, "Lihua",'M', 99, "101 Xinhua Road"};

在变量名后的花括号中提供各个成员的值,将10101, "Lihua",'M', 99, "101 Xinhua Road"按顺序分别赋给student1变量中的num,nam[20],sex,score,address[30]

2.引用结构体变量中成员的值,引用方式:

结构体变量名.成员名

例如:student1.num表示student1变量中的num成员。

在程序中,在定义完结构体变量后,再对结构体成员逐一初始化,例如:

struct student stud1;
	stud1.num = 10101;
	strcpy(stud1.name, "Li si");
	stud1.sex = 'M';
	stud1.score = 99;
	strcpy(stud1.address, "1 Haida Road") ;
	printf("%d,%s,%c,%f,%s\n", stud1.num, stud1.name, stud1.sex, stud1.score, stud1.address);

注意:要给字符数组赋值是不能直接赋值的,需要用strcpy函数。

" . "是成员运算符,它在所有的运算符的优先级最高,所以student1.num可以看作是一个整体。

注意:不能通过结构体变量名来输出结构体变量全部成员的值。

printf("%s\n",student1); //error

只能对结构体变量中的各个成员分别进行输入或输出。

3.对结构体变量中部分成员初始化

例如:

struct student1 = {
.name = "Lisi",
.score = 95
};

文章来源:https://blog.csdn.net/m0_62440901/article/details/134848982
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。