【C语言】结构体

文章目录

结构体

结构体的作用

结构体可以视为自定义的变量类型

在C语言中提供了很多基本数据类型,比如 char、short、int、long、float、double ... 但是当我们需要表示一些比较复杂的数据时,比如存放学生信息时,需要将学生的各个属性(姓名、年龄、学号等)拆分开,如果用基本数据类型表示就会非常麻烦,且给程序阅读和维护带来不便,这个时候据需要使用结构体,结构体可以对一些基本属性进行封装

声明结构体

struct关键字

声明结构体需要使用struct关键字

c 复制代码
struct Student {	//结构体名字最好大写,与变量区分开
    //char name[50];
    char *name;		//姓名属性,字符指针成员,用于存储学生姓名
    				//用数组分配的是静态空间,但使用指针就可以动态存储
    int age;        //年龄属性,整数成员,用于存储学生年龄
    int id;         //学号属性,整数成员,用于存储学生学号
    float score;	//成绩属性,浮点数成员,用于存储学生成绩
    //....更多属性(成员)....
};					//注意结尾的分号表示结束

struct Student student1;	//结构体声明之后,可以单独创建结构体变量
c 复制代码
//也可以在声明结构体的同时创建结构体变量
struct Student {
    char *name;
    int age;
    int id;
    float score;
} student1, student2;

结构体成员是组成结构体的基本元素或字段,每个成员都具有自己的数据类型和名称,用于存储特定类型的数据。结构体成员可以是基本数据类型(如整数、浮点数、字符等),也可以是其他结构体、数组、指针,甚至是函数指针,上面示例中的姓名、年龄、学号都是结构体成员

c 复制代码
//结构体变量创建后,可以通过.运算符访问结构体的成员
student1.age = 20;
student1.id = 1001;

typedef关键字

可以使用typedef简化结构体声明

c 复制代码
typedef struct {
    char *name;
    int age;
    int id;
    float score;
} Student;

//这样一来,就可以直接使用Student作为类型名来声明结构体变量,而不需要再写struct关键字
Student student1;
Student student2;

结构体的嵌套定义

结构体中还可以包含其他结构体,形成嵌套结构

c 复制代码
typedef struct {
    int day;
    int month;
    int year;
} Date;

typedef struct {
    char name[50];
    Date birthdate;
    int id;
} Employee;
//上面代码中,Employee 结构体中嵌套了 Date 结构体
//可以通过以下方式访问嵌套的成员
Employee emp;
emp.birthdate.day = 15;
emp.birthdate.month = 8;
emp.birthdate.year = 1990;

结构体变量

结构体变量的赋值

给结构体变量赋值的方式有多种,包括逐个成员赋值、使用初始化列表、或者通过指针和结构体指针的方式赋值

c 复制代码
typedef struct {
    int day;
    int month;
    int year;
} Date;

typedef struct {
    char name[50];
    Date birthdate;
    int id;
} Employee;

//可以通过点运算符 (.) 逐个对结构体的成员进行赋值
Employee emp1;
emp1.name = "Max";
emp1.birthdate.day = 26;
emp1.birthdate.month = 7;
emp1.birthdate.year = 2004;
emp1.id = 1003;

//在声明结构体变量时,可以使用初始化列表一次性为所有成员赋值
Employee emp2 = {"Yibo", {5,8,1997},1005 };

结构体作为函数参数

c 复制代码
//结构体作为函数参数,printEmployeeInfo函数用于打印员工信息
void printEmployeeInfo(Employee emp){
    printf("姓名:%s\t生日:%d-%d-%d\t工号:%d\n",
           emp.name, emp.birthdate.year,emp.birthdate.month,emp.birthdate.day,emp.id);
}
    
int main(){
    Employee emp2 = {"Yibo", {5,8,1997},1005};
    printEmployeeInfo(emp2);
    return 0;
}

结构体指针

结构体指针的声明和访问

可以声明指向结构体的指针,并通过箭头运算符->访问结构体成员

c 复制代码
Employee *pEmp;
pEmp = &emp1;
//Employee *pEmp = &emp1;
pEmp->id = 1008;

结构体指针作为函数参数

c 复制代码
//结构体指针作为函数参数
void printEmployeeInfo(Employee *pEmp){
    printf("姓名:%s\t生日:%d-%d-%d\t工号:%d\n",
           pEmp->name, pEmp->birthdate.year,pEmp->birthdate.month,
		   pEmp->birthdate.day,pEmp->id);
}

int main(){
    Employee emp2 = {"Yibo", {5,8,1997},1005 };
    Employee *pEmp2 = &emp2;
    printEmployeeInfo(pEmp2);
    return 0;
}

结构体数组

可以声明结构体数组,用于存储多个结构体变量

c 复制代码
Employee employees[100];
c 复制代码
void printEmployeeInfo(Employee pEmp[], int len){
    for(int i = 0; i < len; i++){
        printf("姓名:%s\t生日:%d-%d-%d\t工号:%d\n",
           		pEmp[i]->name, (pEmp+i)->birthdate.year,(pEmp+i)->birthdate.month,
				(pEmp+i)->birthdate.day,(pEmp+i)->id);
        //(pEmp+i) 和 pEmp[i] 都可以正确访问
    }
}

int main(){
    Employee employees[] = {
    	{"Max", {26,7,2004},1003},
    	{"Yibo", {5,8,1997},1005},
    	{"Zoey", {5,9,2000},1008},
    };
    printEmployeeInfo(employees,sizeof(employees)/sizeof(employees[0]));
    return 0;
}

本文主要参考 C语言结构体 视频

相关推荐
秦苒&1 小时前
【C语言指针二】从入门到通透:核心知识点全梳理(野指针,assert断言,指针的使用和传址调用,数组名的理解和使用指针反访问数组)
c语言·开发语言
AndrewHZ1 小时前
【遥感图像入门】遥感图像专用去噪算法:核心方案与实战(PyTorch代码)
pytorch·算法·计算机视觉·cv·遥感图像·高分辨率·去噪算法
前端小L2 小时前
回溯算法专题(八):精细化切割——还原合法的「IP 地址」
数据结构·算法
Tandy12356_2 小时前
手写TCP/IP协议——IP层输出处理
c语言·网络·c++·tcp/ip·计算机网络
Hcoco_me8 小时前
大模型面试题17:PCA算法详解及入门实操
算法
跨境卫士苏苏8 小时前
亚马逊AI广告革命:告别“猜心”,迎接“共创”时代
大数据·人工智能·算法·亚马逊·防关联
程序员小白条8 小时前
0经验如何找实习?
java·开发语言·数据结构·数据库·链表
云雾J视界9 小时前
当算法试图解决一切:技术解决方案主义的诱惑与陷阱
算法·google·bert·transformer·attention·算法治理
Xの哲學9 小时前
Linux Miscdevice深度剖析:从原理到实战的完整指南
linux·服务器·算法·架构·边缘计算
夏乌_Wx9 小时前
练题100天——DAY23:存在重复元素Ⅰ Ⅱ+两数之和
数据结构·算法·leetcode