结构体比较复杂!知识相对来说比较多。作者也是对着日本作家柴田望洋的《明解C语言》反复学习才总结出这篇文章的。话不多说快来学习吧!
目录
什么是结构体?简单来说,结构体就是聚合了一系列数据的数据结构。这些数据可以是不同类型的变量。
1.结构体的声明
这就是结构体的声明。一但声明了结构体,就能在程序中自由的使用“struct 结构名”的结构体类型。
同时我们还可以创建结构体变量:
这里的s1,s2,s3是相同的意思,只是s1,s2表示的是全局变量,而s3表示的是局部变量。
2.结构体成员的类型
我们用struct student来表示结构体类型中的名字、身高、奖学金。
在大括号里面的结构体成员就是被初始化的对象,他们之间用逗号进行分割。(未被初始化的元素被初始化成0)
3 . 运算符
zhangsan.height 对象名.成员名
其中, . 被称为句点运算符,用来表示结构体对象的成员。
4 -> 运算符
在指针变量前加上指针运算符*,就表示该指针指向的对象实体。
在结构体中,可以通过这种形式表示身高 :
(*student).height
通过*student可以表示其指向对象的身高成员。但是,这样子的写法既麻烦又容易出错,素以简介著称的C语言可不会有此疏漏。于是,->出现了。
student->height 表示 指向结构体的指针->成员名
故对于指针指向的结构体成员,推荐使用 ->运算符将其简写。
5.结构体传参
既然都说到了->运算符,那么结构体传参也是必须要介绍的了。
首要问题就是:
结构体传参,传值还是传址?
作者在上一篇文章函数栈帧的创建里面详细介绍了相关内容,C语言:那些不为人所知的函数栈帧的创建和销毁(底层知识)_m0_62319039的博客-CSDN博客https://blog.csdn.net/m0_62319039/article/details/121729334?spm=1001.2014.3001.5501
我们首选函数传址!因为函数如果传值的话,会重新开辟一份内存空间,这对于内存的占用是巨大的。但若是传址调用,只需要把原空间的的地址传过去,这是不是非常环保呢?
struct S {
int data[1000];
int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s) {
printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps) {
printf("%d\n", ps->num);
}
int main()
{
print1(s); //传结构体
print2(&s); //传地址
return 0;
}
(原代码摘录自 原来45 的博客,是一位非常厉害的大佬,有兴趣的小伙伴可以去看看)
(结构体)C语言从入门到入土(入门篇)_原来45的博客-CSDN博客https://blog.csdn.net/weixin_62700590/article/details/121415237至此结构体的内容就简单介绍完了,最后强推日本作家柴田望洋的《明解C语言》这套书,里面知识讲的非常明晰!
咱们下期再见!