10.【C语言详解】结构体
结构体的声明
什么是结构
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构体的声明
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函数。
原因:
函数传参的时候,参数是需要压栈的。
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降.
结论:
结构体传参的时候,要传结构体的地址。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号