C语言复习:结构体
结构体专题
01、结构体类型定义及结构体变量定义
char c1,char c2, char name[62]; int age
char name[62]; int age,char c1,char c2
结构体变量的引用 :.
结构体变量的指针 :->
02、结构体做函数参数
结构体赋值编译器行为研究
结构体变量做函数参数 PK 结构体指针做函数参数
结构体做函数参数(//结构体赋值和实参形参赋值行为研究)
内存四区调用图画法
//从键盘获取数据,给结构体变量初始化,并排序,打印结构体
stack上分配结构数组和heap上分配结构体数组
03、结构体开发的常见模型及典型错误用法
结构体嵌套一级指针
结构体嵌套二级指针
04、结构体中的深拷贝/浅拷贝
问题抛出
解决方法
结构体类型定义及变量定义
/* 结构体类型定义及结构体变量定义;结构体是一种构造数据类型;用途:把不同类型的数据组合成一个整体-------自定义数据类型;结构体类型定义。 */ |
//声明一个结构体类型 struct _Teacher { char name[32]; char tile[32]; int age; char addr[128]; };
//定义结构体变量的方法 /* 1)定义类型 用类型定义变量 2)定义类型的同时,定义变量; 3)直接定义结构体变量; */
struct _Student { char name[32]; char tile[32]; int age; char addr[128]; }s1, s2; //定义类型的同时,定义变量;
struct { char name[32]; char tile[32]; int age; char addr[128]; }s3,s4; //直接定义结构体变量,匿名结构体
//初始化结构体变量的几种方法 //1) struct _Teacher t4 = {"name2", "tile2", 2, "addr2"}; //2) struct Dog1 { char name[32]; char tile[32]; int age; char addr[128]; }d5 = {"dog", "gongzhu", 1, "ddd"};
//3) struct { char name[32]; char tile[32]; int age; char addr[128]; }d6 = {"dog", "gongzhu", 1, "ddd"}; //结构体变量的引用 |
int main() { //struct _Teacher t1, t2; //定义同时初始化 { struct _Teacher t3 = {"name2", "tile2", 2, "addr2"}; printf("%s\n", t3.name); printf("%s\n", t3.tile); }
//用指针法和变量法分别操作结构体 { struct _Teacher t4; struct _Teacher *pTeacher = NULL; pTeacher = &t4;
strcpy(t4.name, "wangbaoming");
strcpy(pTeacher->addr, "ddddd");
printf("t4.name:%s\n", t4.name); }
printf("hello....\n"); getchar(); return 0; } |
结构体做函数参数及结构体数组
//测试两个结构体变量之间可以copy数据吗? //t2 = t1; //测试实参传给形参,编译器的行为 |
//声明一个结构体类型 struct _MyTeacher { char name[32]; char tile[32]; int age; char addr[128]; };
void printfMyteach01(struct _MyTeacher t) { printf("\nt.name:%s", t.name); }
void printfMyteach02(struct _MyTeacher *t) { printf("\nt->name:%s", t->name); } |
//结构体赋值和实参形参赋值行为研究 int main1() { struct _MyTeacher t1, t2; memset(&t1, 0, sizeof(t1));
strcpy(t1.name, "name"); strcpy(t1.addr, "addr"); strcpy(t1.tile, "addr"); t1.age = 1;
//测试两个结构体变量之间可以copy数据吗? //t2 = t1; //测试实参传给形参,编译器的行为 //是可以的 printfMyteach01(t1);
printfMyteach02(&t1);
getchar(); return 0; }
//定义结构体数组 int main() { int i = 0; struct _MyTeacher teaArray[3]; struct _MyTeacher *tmp = NULL; for (i=0; i<3; i++) { strcpy(teaArray[i].name, "aaaaa"); //printf("%s", teaArray[i].name); tmp = &teaArray[i]; printf("%s", tmp->name); } getchar(); return 0; } |
例子
从键盘接受数据。。。。并排序 |
int printfArray(struct _MyTeacher *teaArray, int count) { int i = 0; //打印 for (i=0; i<count; i++) { printf("\n教师名字:"); printf("%s", teaArray[i].name); printf("\n教师年龄:"); printf("%d", teaArray[i].age); }
} int main23() { int i = 0, j = 0; struct _MyTeacher teaArray[3];
struct _MyTeacher tmp;
for (i=0; i<3; i++) { printf("\n请键入教师名字:"); scanf("%s", teaArray[i].name); printf("\n请键入教师年龄:"); scanf("%d", &teaArray[i].age); }
for (i=0; i<3; i++) { for (j=i+1; j<3; j++) { if (teaArray[i].age >teaArray[j].age) { tmp = teaArray[i]; teaArray[i] = teaArray[j]; teaArray[j] = tmp; } } }
//打印 for (i=0; i<3; i++) { printf("\n教师名字:"); printf("%s", teaArray[i].name); printf("\n教师年龄:"); printf("%d", teaArray[i].age); }
printf("ddddd\n"); printfArray(teaArray, 3);
system("pause");
} |
结构体在开发中的应用
//测试输入 //测试打印 //测试malloc //测试typdef用法 //定义结构体数组 |
struct _Student { char name[32]; char tile[32]; };
//声明一个结构体类型 struct _itTeacher { char name[32]; char tile[32]; int age; char addr[128]; };
struct _itAdvTeacher { char *name; char *tile; int age; char *addr; char *p1; char **p2; };
//测试输入 //测试打印 //测试malloc //测试typdef用法
//定义结构体数组 int main() { int i = 0; struct _itTeacher teaArray[3]; struct _itTeacher *tmp = NULL; for (i=0; i<3; i++) { strcpy(teaArray[i].name, "aaaaa"); //printf("%s", teaArray[i].name); tmp = &teaArray[i]; printf("%s", tmp->name); } getchar(); return 0; } |
//内存四字节对齐 |
//结构体实参传给形参,也是一个值copy,相当于t1 = t2; //两个结构体变量之间确实是可以copy,这个是编译器的行为 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?