目录
1.结构体的声明
1.1结构的基础知识
目前C语言我们知道的类型有:char,short,long,int,double,float
这些都可以创建变量,但是很单一的
知道这些类型,难道这些类型能表示这世界上所有的东西吗?
不能,比如说人,学生,
他们是一些复杂对象,描述清楚需要许多变量
学生:年龄+名字+性别+成绩.....
名字存起来用字符数组
年龄存起来(整数)用整型
性别存起来用字符数组
成绩存起来可能有小数用浮点数
四个整合在一起描述学生
如何把这些东西整合到一起?这时候出现了结构体
结构体是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量
1.2结构的声明
struct tag
{
member-list;
}variable-list;
这里的struct是 结构体关键字
这里的struct tag是 结构体类型名
member_list 是 结构体成员变量,也可以叫结构体成员列表
variable_list是 结构体的变量列表
例如:描述一个学生
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[8];//性别
float score;//成绩
}s1,s2,s3;//这里的分号不要丢!
s1,s2,s3是通过struct Stu 类型创建的变量
这里的s1,s2,s3是全局变量
int main()
{
struct Stu s4;
struct Stu s5;//这里的struct不能省略
return 0;
}
这里的s4 s5是局部变量
上面的struct Stu才是结构体类型,不能随便省略struct
但是可以使用typedef类型重定义(类型重命名)
这里不是把struct省略掉了 而是把struct Stu重命名了 struct Stu == Stu
还有一种方法
但这时候不能创建变量列表
这里不是结构体类型变量 而是重命名
1.3结构成员的类型
结构的成员可以是标量,数组,指针,甚至是其他结构体
1.4结构体变量的定义和初始化
有了结构体类型,那如何定义变量,其实很简单
struct Point
{
int x;//横坐标
int y;//纵坐标
}p1;//声明类型变量的同时定义变量p1,p1是全局变量
int main()
{
struct Point p;//定义结构体变量p,p是局部变量
return 0;
}
初始化:定义变量的同时赋初值。
数组有多个变量用大括号来初始化,结构体也一样 使用大括号来初始化
struct Point
{
int x;//横坐标
int y;//纵坐标
}p1 = { 10,15 };//给结构体变量p1横坐标赋值为10,纵坐标赋值为15
int main()
{
struct Point p = { 100,200 };//给结构体变量p横坐标赋值为100,纵坐标赋值为200
return 0;
}
简单的结构体初始化我们会了,复杂一点的呢?
struct Point
{
int x;//横坐标
int y;//纵坐标
}p1 = { 10,15 };//给结构体变量p1横坐标赋值为10,纵坐标赋值为15
struct S
{
char c;
struct Point sp;
double d;
char arr[20];
};
int main()
{
struct Point p = { 100,200 };//给结构体变量p横坐标赋值为100,纵坐标赋值为200
struct S ss = { 'w',{50,20},5.5,"hello CSDN" };//嵌套调用 Point
return 0;
}
这里看到都创建成功了
如果结构体成员里,有指针,记得放上空指针
2.结构体成员的访问
结构成员访问操作符
当我们访问结构体变量的时候用 .
当我们访问结构体指针的时候用 ->
. 结构体变量 . 结构体成员
-> 结构体指针 -> 结构体成员
使用结构体变量.结构体成员来打印
打印结构体成员变量中的结构体时,注意先找到结构体之后,再使用结构成员访问操作符找到结构体中的成员
如果创建个函数要传参打印结构体成员变量呢?
这时候我们可以用 . 操作符,传值调用
这里形参是实参的一份临时拷贝
也可以使用->操作符
这里是传址调用,需要用结构体指针来接收。
把ss地址传给ps,通过地址可以找到ss,
使用->结构体访问操作符,来进行打印
如何对结构体成员变量进行修改?
可以直接使用 . 操作符进行修改
可不可以使结构体变量中的数组直接进行修改?
不可以,因为使用结构体访问到的是一个数组,数组名本质上是首元素地址,不能对地址进行赋值和修改,应该使用字符串拷贝函数strcpy把要修改的内容放到arr这块空间中去。
注意使用strcpy要引用库函数头文件 #include
#include <stdio.h>
#include <string.h>
int main()
{
struct Point p = { 100,200 };//给结构体变量p横坐标赋值为100,纵坐标赋值为200
struct S ss = { 'w',{50,20},5.5,"hello CSDN" };
ss.c = 'b';
ss.sp.x = 200;
ss.sp.y = 100;
ss.d = 3.14;
strcpy(ss.arr, "hello,bit");
return 0;
}
3.结构体传参
print1 print2都是结构体传参?哪个更好一点?
如果像p1,结构体结构很大,再拷贝一份浪费的空间会很大
函数传参的时候,参数是需要压栈的。
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
p2的话,不管结构体有多大,只有四个字节或者八个字节,更加节省空间
结论:
结构体传参的时候,要传结构体的地址
个人水平不足 如果代码中有错误,可以多多在评论区指出,一定会及时修改!
谢谢大家看到这里 觉得有收获的话可以三连一下 一起加油!