ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

C语言结构体从入门到实战:一文吃透声明、初始化、访问与传参

C语言结构体从入门到实战:一文吃透声明、初始化、访问与传参 C语言知识点今日知识点 ——初识结构体把不同类型的数据装进一个盒子1、什么是结构体结构体是一些值的集合这些值称为成员变量。结构的每个成员可以是不同类型的变量。2、集合数组一组相同类型的元素的集合结构体是一些值的集合这些值称为成员变量。结构的每个成员可以是不同类型的变量。3、结构成员的类型结构的成员可以是标量、数组、指针、甚至是其他结构体练习代码structB{charc;shorts;doubled;};//分号不要忘structStu{//结构体成员变量可以是另外一个结构体、标量、数组、指针structBb;charname[20];//名字intage;//年龄charid[20];}s1,s2;//变量列表s1和s2也是结构体变量//s1,s2是全局变量intmain(){//s是局部变量structStus;//对象return0;}今日知识点 ——结构体初始化1、什么是结构体初始化结构体初始化就是在定义结构体变量的同时给它的成员变量赋初值。2、初始化方式方式一定义时按成员顺序初始化structStus{叶汶,20,20260926};按结构体成员声明的顺序依次给出初值用{}括起来各初值之间用逗号分隔。初值的类型必须与对应成员的类型一致。方式二嵌套结构体的初始化structStus{{w,20,3.14},叶汶,20,20260926};当结构体成员本身是另一个结构体时内层用一对{}单独初始化。例如{w, 20, 3.14}是对成员struct B b的初始化。3、注意事项初始化时初值个数可以少于成员个数未赋值的成员会被自动补 0或空字符串。初值个数不能多于成员个数否则编译报错。结构体变量初始化与赋值不同初始化发生在定义时赋值发生在定义之后。始化练习代码#includestdio.hstructB{charc;shorts;doubled;};//分号不要忘structStu{//结构体成员变量可以是另外一个结构体、标量、数组、指针structBb;charname[20];//名字intage;//年龄charid[20];}s1,s2;//变量列表s1和s2也是结构体变量//s1,s2是全局变量intmain(){//s是局部变量structStus{{w,20,3.14},叶汶,20,20260926};//结构体变量的初始化{w,20,3.14}是对struct B b的初始化return0;}今日知识点 ——结构体1、什么是结构体成员访问结构体成员访问就是通过结构体变量或结构体指针读取或修改结构体内部成员变量的值。2、访问方式方式一通过结构体变量直接访问点操作符.printf(%c\n,s.b.c);// 访问嵌套结构体成员输出 wprintf(%s\n,s.name);// 访问字符数组成员输出 叶汶使用点操作符.语法为结构体变量.成员名。若成员本身是结构体可以连续使用.逐层访问如s.b.c。方式二通过结构体指针访问箭头操作符-structStu*pss;// 定义结构体指针指向 s 的地址printf(%c\n,(*ps).b.c);// 原始写法(*ps) 等价于 sprintf(%c\n,ps-b.c);// 语法糖写法ps-b 等价于 (*ps).b先定义一个结构体指针ps让它指向结构体变量s的地址。原始写法(*ps).b.c其中(*ps)取出指针指向的结构体完全等价于s。语法糖写法ps-b.c箭头操作符-专门用于结构体指针ps-b等价于(*ps).b。3、注意事项点操作符.用于结构体变量箭头操作符-用于结构体指针二者不能混用。嵌套结构体成员需要逐层访问例如s.b.c表示先取s的成员b再取b的成员c。通过指针访问时(*ps).b.c与ps-b.c完全等价箭头写法更简洁。成员访问练习代码#includestdio.hstructB{charc;shorts;doubled;};//分号不要忘structStu{//结构体成员变量可以是另外一个结构体、标量、数组、指针structBb;charname[20];//名字intage;//年龄charid[20];}s1,s2;//变量列表s1和s2也是结构体变量//s1,s2是全局变量intmain(){//s是局部变量structStus{{w,20,3.14},叶汶,20,20260926};//结构体变量的初始化{w,20,3.14}是对struct B b的初始化//printf(%c\n,s.b.c);//wprintf(%s\n,s.name);//叶汶//结构体成员访问: .和-// 1. 定义一个结构体指针 ps指向结构体变量 s 的地址structStu*pss;// 2. 通过指针访问结构体成员的原始写法(*ps).b.c// (*ps) 就是取出指针指向的那个结构体也就是完全等价于 s// 所以 (*ps).b.c 完全等价于 s.b.cprintf(%c\n,(*ps).b.c);//w// 3. 通过指针访问结构体成员的语法糖写法ps-b.c// - 叫做箭头操作符专门用于结构体指针。// ps-b 相当于 (*ps).b// ps-b.c 就相当于 (*ps).b.cprintf(%c\n,ps-b.c);//wreturn0;}今日知识点 ——结构体传参结构体传参有两种方式传值调用print1(s)把整个结构体拷贝一份传给函数结构体越大开销越大。传址调用print2(s)只传一个指针8 字节开销小、性能好。结论首选传址调用指针避免大结构体压栈导致性能下降。练习代码structB{charc;shorts;doubled;};//分号不要忘structStu{structBb;charname[20];intage;charid[20];};voidprint1(structStut){printf(%c %d %lf %s %d %s\n,t.b.c,t.b.s,t.b.d,t.name,t.age,t.id);}voidprint2(structStu*ps){printf(%c %d %lf %s %d %s\n,ps-b.c,ps-b.s,ps-b.d,ps-name,ps-age,ps-id);}intmain(){structStus{{w,20,3.14},叶汶,20,20260926};//写一个函数打印s的内容print1(s);//传值调用print2(s);//传址调用return0;}打印结果上面的print1和print2函数哪个好一些首选print2函数传参的时候参数是需要压栈的如果传递一个结构体对象的时候结构体过大参数压栈的系统开销比较大所以会导致性能的下降。参数压栈是什么压栈 进栈 把数据放到栈顶和出栈正好相反。栈是一种数据结构先进的后出后进的先出函数调用的过程中如何传参
返回列表