一. 结构体的声明
1. 基础知识
为什么会有结构体呢 有了int float这些类型的变量不就够了嘛?
我们说 要描述一个复杂对象的时候 光靠简单的int 和float是不能够准确描述的
例如学生 他要有名字 要有学号等等
1.2 结构体的声明
我们规定 结构体声明要满足以下格式
struct tag { member - list; }variable-list;
例如 我们使用结构体来描述一个学生
struct stu { char name[20];//名字 int age;//年龄 char sex[5];//性别 char id[20];//学号 }stu;//分号不能丢 //实际上上面一行的stu是一个全局变量 我们在使用结构体创建变量的时候一般要使用局部变量
1.3 结构成员的类型
结构的成员可以是标量 数组 指针 甚至是其他结构体。
1.4 结构体变量的定义和初始化
struct Point { int x; int y; }p1; struct Point p2; //定义结构体变量p2 // 初始化 定义变量的同时赋值 struct Point p3 = { 2,3 };
定义初始化的三种方式
p1 p2 p3
struct Point { int x; int y; }p1; struct Point p2; //定义结构体变量p2 // 初始化 定义变量的同时赋值 struct Point p3 = { 2,3 }; struct Node { int date;//整形 struct Point p;//结构体类型 struct Node* next;//指针类型 }; struct Node n1 ={2,{2,3},NULL };
放置结构体中的三种类型
二. 结构体成员的访问
1. 结构体变量访问成员
结构变量成员是通过点操作符来访问的。
点操作符接受两个操作数。 例如 :
struct stu { char name[20]; int age; }; struct stu s1={"xiaomengxin",18 }; int main() { s1.age = 20;//使用.访问age }
那么同学们思考一下可不可以使用上面的操作来修改name呢?
答案是不可以
因为s1.name其实访问的是name这个数组的地址 地址是不能被修改的
那么我们要怎么修改呢 ?
还记不记得我们之前学过一个函数
strcpy()
struct stu { char name[20]; int age; }; struct stu s1={"xiaomengxin",18 }; int main() { s1.age = 20;//使用.访问age strcpy(s1.name, "9527"); }
这样子就可以啦
2. 结构体指针访问成员的变量
struct stu* p = &s1; (*p).age; (*p).name; p->age; p->name;
和结构体变量差不多
要注意的是多了一个可以用指针变量指向结构体成员的方法
三. 结构体传参
struct S { int date[1000]; int num; }; struct S s1 = { {1,2,3,4} ,5 }; void print1(struct S s1) { printf("%d\n", s1.num); } void print2(struct S* p1) { printf("%d\n", p1->num); } int main() { print1(s1); print2(&s1); return 0; }
上面的代码就能很好的说明问题
两种传参方式
传值调用和传址调用
我们这里推荐使用传址调用 至于原因呢 大家可以参考我写的这两篇博客
函数栈帧上
函数栈帧下
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够
不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯