一. 结构体的声明
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;
1.3 结构成员的类型
结构的成员可以是标量 数组 指针 甚至是其他结构体。
1.4 结构体变量的定义和初始化
struct Point
{
int x;
int y;
}p1;
struct Point p2;
struct Point p3 = { 2,3 };
定义初始化的三种方式
p1 p2 p3
struct Point
{
int x;
int y;
}p1;
struct Point 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;
}
那么同学们思考一下可不可以使用上面的操作来修改name呢?
答案是不可以
因为s1.name其实访问的是name这个数组的地址 地址是不能被修改的
那么我们要怎么修改呢 ?
还记不记得我们之前学过一个函数
strcpy()
struct stu
{
char name[20];
int age;
};
struct stu s1={"xiaomengxin",18 };
int main()
{
s1.age = 20;
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;
}
上面的代码就能很好的说明问题
两种传参方式
传值调用和传址调用
我们这里推荐使用传址调用 至于原因呢 大家可以参考我写的这两篇博客
函数栈帧上
函数栈帧下
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够
不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯
|