C[8] 结构体struct
C[8] 结构体struct
结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员” ,其描述了一块内存区间的大小及解释意义 。
1、定义结构体
C语言提供了关键字struct来标识所定义的结构体类型。
1 2 3 4 5 6 | struct tag { //tag 是结构体标签。 member-list //member-list 是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。 member-list member-list ... } variable-list ; //variable-list 结构变量,定义在结构的末尾,最后一个分号之前,可以指定一个或多个结构变量. |
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | //1、结构体中,tag 和 variable-list 至少要出现1个,示例: //1.1 没有tag标签的结构体, struct { int a1; //整型 char a2; //字符型 double a3; //双精度 } test; //结构体变量 //1.2 没有结构体变量的结构体, struct Ttest{ int a1; char a2; double a3; }; struct Ttest t1, t2[5], *t3; //使用用Test 标签的结构体,声明了变量 t1、t2、t3 //2、结构体包含 struct Ttest2{ char string[50]; struct Ttest1 a; //此结构体的声明包含了其他的结构体 }; struct Ttest3{ char string[50]; struct Ttest3 *N1; //此结构体的声明包含了指向自己类型的指针 }; //如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明,如下所示: struct B; //对结构体B进行不完整声明 struct A{ struct B *p; //结构体A中包含指向结构体B的指针 //其他成员 }; struct B{ struct A *p; //结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明 //其他成员 }; |
2、结构体变量的初始化、成员访问、函数访问、结构指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #include <stdio.h> #include <string.h> //滔Roy 2021.11.05 struct Ttest{ int a1; char a2[100]; //定义大小 char a2[100]; double a3; }; struct Ttest1{ int a1; char a2[100]; double a3; }test3={150, "Hello TaoRoy3!" ,45.67} ; void printTest( struct Ttest test ); //函数声明 void printTestP( struct Ttest *test ); //函数声明 指针参数 int main( ) { struct Ttest test1; /* 声明 test1,类型为 Ttest */ struct Ttest test2; /* 声明 test2,类型为 Ttest */ struct Ttest test4; /* 声明 test4,类型为 Ttest */ //测试结构作为函数参数的输出 struct Ttest test5; /* 声明 test5,类型为 Ttest */ //测试结构作为函数指针参数的输出 /* test1 详述 */ test1.a1=100; strcpy ( test1.a2, "Hello TaoRoy1!" ); //不能这样写: test1.a2="Hello TaoRoy1!"; test1.a3=99.99; /* test2 详述 */ test2.a1=50; strcpy ( test2.a2, "Hello TaoRoy2!" ); test2.a3=12.34; /* 输出 test1 信息 */ printf ( "test1.a1 : %d\n" , test1.a1); printf ( "test1.a2 : %s\n" , test1.a2); printf ( "test1.a3 : %4.2f\n" , test1.a3); /* 输出 test2 信息 */ printf ( "test2.a1 : %d\n" , test2.a1); printf ( "test2.a2 : %s\n" , test2.a2); printf ( "test2.a3 : %4.2f\n" , test2.a3); /* 输出 test3 信息 */ printf ( "test3.a1 : %d\n" , test3.a1); printf ( "test3.a2 : %s\n" , test3.a2); printf ( "test3.a3 : %4.2f\n" , test3.a3); /* test4 详述 */ test4.a1=44; strcpy ( test4.a2, "Hello TaoRoy4!" ); test4.a3=44.39; printTest(test4); /* 结构作为函数参数的输出 test4 信息 */ /* test5 详述 */ test5.a1=55; strcpy ( test5.a2, "Hello TaoRoy5!" ); test5.a3=55.55; printTestP(&test5); //使用& 运算符放在结构名称的前面,查找结构变量的地址 return 0; } void printTest( struct Ttest test ) { printf ( "test.a1 : %d\n" , test.a1); printf ( "test.a2 : %s\n" , test.a2); printf ( "test.a3 : %4.2f\n" , test.a3); } void printTestP( struct Ttest *test ) { printf ( "test->a1 : %d\n" , test->a1); //结构的指针访问结构的成员,必须使用 -> 运算符 printf ( "test->a2 : %s\n" , test->a2); printf ( "test->a3 : %4.2f\n" , test->a3); } |
创建时间:2021.11.05 更新时间:
博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你有所帮助,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报