结构体的声明
什么是结构
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构体的声明
struct tag
{
member-list;
}variable-list;
结构体的作用
我们想用一个变量描述一个人,那如何实现呢?
C语言提供给我们的基础类型中,都是只能描述某一个方面。
然而人或者其他的复杂对象是多元的,需要很多变量去描述特征,那么结构体就能做到这件事。
例如描述一个学生:
typedef struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}Stu;
结构成员的类型
结构成员的类型可以是C语言提供给我们的基础类型,也可以是另一个结构体。
注意:这个结构体不能是结构体本身,否则会形成递归。
结构体变量的定义和初始化
struct Point p3 = {x, y};
struct Stu //类型声明
{
char name[15];//名字
int age; //年龄
};
struct Stu s = {"zhangsan", 20};//初始化
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化
初始化方式与数组有些相似,不过数组初始化时括号中元素的类型都是相同的,结构体则不受限制。
各个成员的初始化方式还是与普通类型初始化方式相同,不过是用大括号括在一起(注意顺序要对应)。
结构体成员的访问
- 结构体变量访问成员
结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数
例子:
struct Stu
{
char name[20];
int age;
};
成员有name和age,那么如何访问它们呢?
使用.操作符
例如:
struct Stu s;
strcpy(s.name, "songxin");
s.age = 20;
直接通过结构体变量名去访问。
结构体的指针可以访问结构体吗?
->操作符
struct Stu* ps = &s;
//方法一:
strcpy((*s).name, "songxin");
(*s).age = 20;
//方法二:
strcpy(s->name, "songxin");
s->age = 20;
可以理解为结构体指针指向的那个东西的某个成员ps->某成员
结构体传参
函数传参方式通常有两种:
- 传值
- 传地址
结构体也不例外。
struct S
{
int data[1000];
int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{
printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
printf("%d\n", ps->num);
}
int main()
{
print1(s); //传结构体
print2(&s); //传地址
return 0;
}
到底哪种好一些呢?
从两个方面看:
-
效率
-
如果将整个结构体的值传过去,如果结构体过于复杂,那么开销过于巨大
-
传指针,无论结构体有多么复杂,最终传指针只需要四个字节或者八个字节。
-
-
需要改变结构体值的函数
- 传值,那么形参只是一份原变量的拷贝,函数体内改变不会影响实际参数。
上面的 print1 和 print2 函数哪个好些?
答案是:首选print2函数。
原因:
函数传参的时候,参数是需要压栈的。
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降.
结论:
结构体传参的时候,要传结构体的地址。
标签:10,20,struct,name,int,C语言,Stu,详解,结构 From: https://www.cnblogs.com/ncphoton/p/16950153.html