目录
一.结构体类型的创建
这表示我们创建了一个 struct Stu 的自定义类型,注意struct Stu是类型,创建的格式如上图所示,使用的是大括号,同时可以顺带着创建几个struct Stu类型的变量,此时创建的这些变量都是全局变量。声明结构体类型是在主函数之外做的,当然创建了类型之后我们可以在主函数里面创建这种类型的局部变量,如图
如果觉得我们自己定义的这种类型名字比较长,可以使用typedef进行重定义
此时我们创建的类型就等价于Stu。
二.结构体成员的类型
结构体成员可以是标量,数组,指针,甚至是其他结构体。
三.结构体类型的初始化
结构体类型的变量初始化使用的是大括号
如果我们想用函数对结构体类型进行初始化,如图
在初始化成员变量name的内容时候,不能直接写name="张三",这是因为name是数组名也即数组首元素的地址,不能把一个字符串放到地址里面去,而是应该放到地址指向的空间里面去,如果直接写name="张三",编译器报错说表达式必须有可修改的左值,这是因为name是一个确定的常数,即name数组的首元素地址。已知一个地址,想要把以这个地址开始的一块空间放上一个字符串,应该使用strcpy函数。然而接下来我们想要用我们自己定义的print_stu函数打印这个已经被初始化的结构体变量s的时候,发现结果居然是0,这是因为我们在初始化s的时候用的是传值调用,在把s传给set_stu函数的时候,这个函数就会在内存空间上创建s的临时拷贝t,然后为t申请一块空间,在这块空间上面进行一系列初始化,此时s并未被初始化,当然打印结果是0。想要用函数对s进行初始化,应该使用传址调用,如图
也可以使用箭头操作符
struct Stu类型的指针ps指向了结构体,至于我们想要让他指向结构体的哪个成员变量,就用箭头操作符来指定。
四.结构体成员的访问
结构体成员访问是通过点操作符或者箭头操作符来实现的,点操作符针对的是结构体类型变量,箭头操作符针对的是结构体类型变量的地址。这个结构体变量的地址放在一个指针比如ps里面,我们就说ps指向了这个结构体变量,至于ps指向结构体类型的哪个成员变量,我们可以用箭头操作符来指定。
五.结构体传参
首先看到这个结构体类型的成员变量是一个能放1000个int类型元素的数组和一个int类型,因此这个结构体类型非常大,如果采用传值调用,操作系统就要开辟一块同样很大的空间作为实参的临时拷贝,这就浪费了很多的内存,因此在结构体传参的时候尽量采用传址调用。将结构体变量的地址传过去。