目录
结构体的初始化
定义:
结构体 (struct)指的是一种数据结构 , 是C语言中 复合数据类型 的一类。 结构体可以被声名为 变量 、指针 或 数组 等, 用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员, 且这些成员可以为不同的类型, 成员一般用名字访问。
简单而言之:c语言中有 int char 等等类型,但是当我们想要描述人这一复杂的类型,便可用到我们的结构体类型(struct),可自己定义该类型,可用来描述人的相关属性。
举例:
#include<stdio.h> #define _CRT_SECURE_NO_WARNINGS struct MyStruct1 { char c; short d; double e; }; struct MyStruct2 { // 成员变量 struct MyStruct1 ss1; char name[20]; // 名字 int age; // 年龄 char id[20]; // 学号 }s1,s2; // s1,s2为结构体全局变量 int main() { // s3为结构体局部变量 struct MyStruct2 s3 = { {'w', 20, 3.14}, "张三", 30, "20211227"};// 对象 // 初始化 ss1 name age id return 0;
结构体成员的访问
我们需利用到操作符 . 和 ->
想详细了解有关操作符相关知识可点击该链接 https://blog.csdn.net/weixin_63888301/article/details/121892181?spm=1001.2014.3001.5501
举例:
#include<stdio.h> #define _CRT_SECURE_NO_WARNINGS struct MyStruct1 { char c; short d; double e; }; struct MyStruct2 { // 成员变量 struct MyStruct1 ss1; char name[20]; // 名字 int age; // 年龄 char id[20]; // 学号 }s1,s2; // s1,s2为结构体全局变量 int main() { // s3为结构体局部变量 struct MyStruct2 s3 = { {'w', 20, 3.14}, "张三", 30, "20211227"};// 对象 // 初始化 ss1 name age id // 结构体成员的访问 printf("%c\n", s3.ss1.c); printf("%s\n", s3.id); struct MyStruct2* pd = &s3; printf("%c\n", (*pd).ss1.c); printf("%c\n", pd->ss1.c); return 0; }
结果为:
结构体传参
我们可用两种传参形式:传值调用和传址调用
想详细了解传值调用和传址调用的区别可点击该链接https://blog.csdn.net/weixin_63888301/article/details/121353547?spm=1001.2014.3001.5501
举例:
#include<stdio.h> #define _CRT_SECURE_NO_WARNINGS struct MyStruct1 { char c; short d; double e; }; struct MyStruct2 { // 成员变量 struct MyStruct1 ss1; char name[20]; // 名字 int age; // 年龄 char id[20]; // 学号 }s1,s2; // s1,s2为结构体全局变量 void print1(struct MyStruct2 t ) // 传值调用 { printf("%c %d %lf %s %d %s\n", t.ss1.c, t.ss1.d, t.ss1.e, t.name, t.age, t.id); } void print2(struct MyStruct2 * pp) // 传址调用 { printf("%c %d %lf %s %d %s\n", pp->ss1.c, pp->ss1.d, pp->ss1.e, pp->name, pp->age, pp->id); } int main() { struct MyStruct2 s3 = { {'w', 20, 3.14}, "张三", 30, "20211227" }; print1(s3); return 0; }
结果:
虽然这两种方式都能实现结构体的传参,但更推荐使用传址调用,理由如下:
函数在传参的时候,参数是需要压栈的。当一个传递的结构体对象过大时,参数压栈的系统开销就会比较大,便会导致性能的下降。
那什么是压栈呢?
栈区通常 都会开辟空间来储存各数据,而我们的栈是一种数据结构,遵循先进的后出,后进的先出规则。
类似于下图:(先存 1 再存 2 依照循序直到存到 6 ,而出栈则需先出 6 依照循序 直到出 1)
而我当我们传结构体的地址时,仅传了其地址的4个字节,从而更好的提高了速度。
初阶结构体的内容就是这么多了,博主后期还会更进阶的内容哦!
谢谢浏览,博主写文章不易,可以留下您的点赞,或收藏激励博主!
若文章有错误,请各大佬多多指出,我会及时更正!