一,前言
C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类 型还是不够的,假设我想描述学⽣,描述⼀本书,这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要 名字、年龄、学号、⾝⾼、体重等;描述⼀本书需要作者、出版社、定价等。C语⾔为了解决这个问 题,增加了结构体这种⾃定义的数据类型,让程序员可以自己创造适合的类型。
二,结构体详解
什么是结构体:
官方来说结构体就是一些值的集合,这些值称为成员变量.结构体的每个成员可以是不同类型的变量.说到集合,数组也是集合,但是不同的是数组只能是相同类型元素的集合.
我们为什么要用到结构体呢? 在我们实际的应用中,比如对学生的信息进行管理时,学生的信息有:姓名(char),性别(char),学号(int),成绩(float)等多种数据.如果把这写数据分别单独定义的,就会特别松散,复杂,难以管理.因此这时我们需要把一些相关的变量组合起来,以一个整体形式对对象进行描述.这就结构体的魅力.
结构体类型的声明:
我们以一个学生的信息来描述结构体类型的声明,假如我们要记录学生的姓名(char),性别(char),年龄(int),学号(char),成绩(flaot).等信息时可以这样声明结构体:
struct stu
{
char name [20]; //姓名
char sex[5]; //性别
int year; //年龄
char ID[20]; //学号
float grade[20]; //成绩
};
在这里我们只是对结构体进行了声明,也就是 struct stu 就是结构体的变量类型.然后接下来就是创建结构体变量.
定义结构体变量:
方法一:先声明结构体,在创定义构体变量.
//声明结构体
struct student
{
char name [20]; //姓名
char sex[5]; //性别
int year; //年龄
char ID[20]; //学号
float grade[20]; //成绩
};
定义结构体变量
struct student stu1,tu2;
方法二:在声明结构体的同时定义结构体变量
//声明结构体类型
struct stu
{
char name [20]; //姓名
char sex[5]; //性别
int year; //年龄
char ID[20]; //学号
float grade; //成绩
}stu1,stu2; //声明结构体变量
方法三;直接定义结构体变量
struct
{
char name [20]; //姓名
char sex[5]; //性别
int year; //年龄
char ID[20]; //学号
float grade; //成绩
}stu1,stu2;
在这里我们要注意的是:
只有结构体变量才能分配地址,而结构体的定义是不分配空间的
结构体变量的声明需要在主函数之上或者在主函数中声明,如果在主函数之下则会报错.
初始化结构体:
先声明结构体,再定义结构体变量和初始化
//声明结构体
struct student
{
char name [20]; //姓名
char sex[5]; //性别
int year; //年龄
char ID[20]; //学号
float grade; //成绩
};
定义结构体变量并初始化
struct student stu1 = {"小明","男",18,"234192371",99.88};
struct student stu2 = {"小美","女",19,"234192372",99.99};
在声明结构体的同时定义结构体变量,再初始化结构体
//声明结构体并定义结构体变量
struct student
{
char name [20]; //姓名
char sex[5]; //性别
int year; //年龄
char ID[20]; //学号
float grade; //成绩
}stu1,stu2;
初始化结构体变量
stu1 = {"小明","男",18,"234192371",99.88};
stu2 = {"小美","女",19,"234192372",99.99};
按指定的顺序初始化结构体变量:
//声明结构体
struct student
{
char name [20]; //姓名
char sex[5]; //性别
int year; //年龄
char ID[20]; //学号
float grade; //成绩
};
定义结构体变量并初始化
struct student stu1 = {"小明","男",18,"234192371",99.88};
struct student stu2 = {.name="小美",.ID="23216234",.year=18,.sex="女",.grade=99.99};
结构体成员的访问:
结构体成员的直接访问
#include <stdio.h>
struct student
{
char name [20]; //姓名
char sex[5]; //性别
int year; //年龄
char ID[20]; //学号
float grade; //成绩
};
int main()
{
定义结构体变量并初始化
struct student stu1 = {"小明","男",18,"234192371",99.88};
struct student stu2 = {.name="小美",.ID="23216234",.year=18,.sex="女",.grade=99.99};
//直接访问结构体成员
printf("name = %s,sex = %c,grade =%f",stu1.name,stu1.sex.stu1.grade);
}
结构体成员的间接访问:
有时候我们得到的不是⼀个结构体变量,而是得到了⼀个指向结构体的指针。
#include <stdio.h>
struct student
{
char name[20];
char sex[5];
int year ;
};
int main()
{
struct student stu = {"小美","女", 18};
struct student *ptr = &stu ;
ptr->name = "小明";
ptr->sex = "男";
ptr->year = 10;
printf("name = %s sex = %c year = %d\n", ptr->name, ptr->sex,ptr->year);
return 0
}
typedef 关键字与结构体
typedef 用来定义新的数据类型,通常typedef 与结构体的定义配合使用.使用typedef 的目的使结构体的表达更加简练
struct student //结构体变量类型
{
char name[20];
char sex[5];
int year ;
}stu; //这里的stu为结构体变量
typedef struct stdent
{
char name[20];
char sex[5];
int year ;
}stu; //结构体变量类型
//stu 相当于 struct student