目录
励志模块
大胆去活,逼自己去突破,别得过且过。
1 结构体的声明
1.1 结构的基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
(数组是一组相同类型元素的集合)因为生活中的对象都是复杂的,比如:一个人:姓名+年龄+性别+电话 才能描述。(结构体就是用来描述复杂对象的)
1.2 结构的声明
struct stu //struct 是结构体关键字,stu(这个是自己定义的,student的前三个字母)
{//学生:姓名+年龄+分数
char name[20];//姓名是字符类型,
int age;//年龄
float score;//分数
};
1.3 结构成员的类型
结构的成员可以是标量、数组、指针,甚至是其他结构体
1.4 结构体变量的定义和初始化
1.4.1 结构体类型的局部定义
定义一个局部的结构体变量,代码展示:
struct stu //struct 是结构体关键字,stu(这个是自己定义的,student的前三个字母)
{//学生:姓名+年龄+分数
char name[20];//姓名是字符类型,
int age;//年龄
float score;//分数
};
int main()
{
struct stu s;//s就是结构体变量,struct stu 就是和int char float 一样的类型
return 0;
}
1.4.2 结构体类型的全局定义
定义一个全局的结构体变量,代码展示:
struct stu //struct 是结构体关键字,stu(这个是自己定义的,student的前三个字母)
{//学生:姓名+年龄+分数
char name[20];//姓名是字符类型,
int age;//年龄
float score;//分数
}s1, s2;//这里的s1 s2 和s一样,也是结构体变量,(全局的)
int main()
{
struct stu s;//s就是结构体变量,struct stu 就是和int char float 一样的类型,但是却是局部的
return 0;
}
注意:
结构体变量,那个分号不能丢。
1.4.3 结构体类型的初始化
代码展示:
struct stu
{
char name[20];
int age;
float score;
};
int main()
{
struct stu s = { "xiaoming", 20, 97.5f };//97.5 后面加f说明是float类型,不加的话,会默认为为double类型
printf("%s %d %f", s.name, s.age, s.score);
return 0;
}
97.5 后面加f说明是float类型,不加的话,系统会默认为为double类型
1.4.4 结构体类型嵌套初始化
代码展示:
#include <stdio.h>
struct S
{
int a;
char b;
double c;
};
struct stu
{
struct S ss;
char name[20];
int age;
float score;
};
int main()
{
struct stu s = { { 20, 's', 3.14 },"xiaoming", 20, 97.5f };
printf("%d %c %lf %s %d %f", s.ss.a, s.ss.b,s.ss.c,s.name, s.age, s.score);
return 0;
}
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = {10, {4,5}, NULL};
2 结构体成员的访问
(1) 结构体变量访问成员
结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数
(2)结构体指针访问指向变量的成员
3 结构体传参
代码展示:(结构体传参)
#include <stdio.h>
struct mn
{
int arr[1000];
int a;
char ch[100];
};
void print(struct mn n)
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", n.arr[i]);
}
printf("\n");
printf("%d\n", n.a);
printf("%s\n", n.ch);
}
int main()
{
struct mn s = { { 1,2,3,4,5,6,7,8,9,10 }, 8, "abcdefg" };
print(s);
return 0;
}
代码展示:(结构体地址传参)
#include <stdio.h>
struct mn
{
int arr[1000];
int a;
char ch[100];
};
void print(struct mn* n)
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", n->arr[i]);
}
printf("\n");
printf("%d\n", n->a);
printf("%s\n", n->ch);
}
int main()
{
struct mn s = { { 1,2,3,4,5,6,7,8,9,10 }, 8, "abcdefg" };
print(&s);
return 0;
}
结构体传参,形参是实参的一份临时拷贝。所以会浪费大量的内存。但是结构体传地址,仅仅把4个字节或者8 个字节传过去即可。
所以我们最佳选择是 结构体传址。原因是:函数传参的时候,参数是需要压栈的。
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的
下降
结论:
结构体传参的时候,要传结构体的地址。