目录
基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
一般在 main() 函数外部声明,但在 main() 里面也可以声明,但只能在内部使用,有限制
结构的成员可以是标量、数组、指针,甚至是其他结构体
结构的声明和初始化
无变量列表
struct student { char name[20]; char tele[12]; float score; };
struct - 结构体关键字
student - 标记,稍后程序中可以使用该标记引用该结构
struct student 是用户定义的结构体类型
({ })中的是成员列表
name , tele , score - 结构体的成员名
后面的程序中,我们可以这样声明:
#include <stdio.h> struct student { char name[20]; char tele[12]; float score; }; int main() { struct student stu = { "张三","13838389438", 114.5}; return 0; }
这里,stu 是定义的结构体变量,是局部变量,把 stu 声明为一个使用 student 结构布局的结构变量
有变量列表
struct student { char name[20]; char tele[12]; float score; }s1, s2; // 多了变量,是全局变量
这里的 s1 和 s2 是使用 struct student 结构体类型创建的两个变量,如果放在({ })外面定义,是全局变量
结构体内有结构体的初始化
#include <stdio.h> struct student { char name[20]; char tele[12]; double score; }; struct St { struct student s1; char sex[5]; double height; }; int main() { struct student stu = { "张三","13838389438", 114.5}; struct St St1 = { {"李四","13812345678", 138.5},"男", 181.1 }; // 初始化 return 0; }
打印
结构体变量.成员变量(.操作符)
#include <stdio.h> struct student { char name[20]; char tele[12]; double score; }; struct St { struct student s1; char sex[5]; double height; }; int main() { struct student stu = { "张三","13838389438", 114.5 }; struct St St1 = { {"李四","13812345678", 138.5},"男", 181.1 }; // 结构体对象打印 printf("%s %s %.1f\n", stu.name, stu.tele, stu.score); printf("%s %s %.1f %s %.1f\n", St1.s1.name, St1.s1.tele, St1.s1.score, St1.sex, St1.height); return 0; }
在这里,stu,St1,s1 都是结构体变量,所以用 .操作符
结构体指针->成员变量(->操作符)
#include <stdio.h> struct student { char name[20]; char tele[12]; double score; }; struct St { struct student s1; char sex[5]; double height; }; void print1(struct student stu1) //形参 { printf("%s %s %.1f\n", stu1.name, stu1.tele, stu1.score); } void print2(struct student* pstu) // 结构体指针 { printf("%s %s %.1f\n", pstu->name, pstu->tele, pstu->score); } int main() { struct student stu = { "张三","13838389438", 114.5 }; struct St St1 = { {"李四","13812345678", 138.5},"男", 181.1 }; print1(stu); //结构体传参,传结构体变量本身 print2(&stu); //传参,传结构体地址 return 0; }
总结
- 函数传参时,参数是需要压栈的。如果传递一个结构体对象时,结构体过大,参数压栈的系统开销比较大,所以会导致性能下降(形参是实参的一份临时拷贝)
- 结构体传参时,要传结构体的地址