一.结构体类型的声明
1.1结构体的基础知识
结构是一些值的集合,这些值称为成员变量。
结构的每个成员可以是不同类型的变量。
我们通常利用结构体来描述复杂类型。
1.2结构体的声明
struct tag { member_list;//成员列表 }variable_list;//变量列表
tag:结构体的名字,依据实际情况进行名字的选择或者命名
member_list:成员列表,可以存在1个或者多个
variable_list:变量列表
下面是一个例子:
//描述一个学生 //名字+年龄+性别 struct Stu { //成员变量,用来描述结构体对象的相关属性 char name[20]; int age; char sex[5];//男 女 保密 }s2,s3,s4;//s2,s3,s4就是结构体变量---全局变量 int main() { struct Stu s1; //Stu s2; //在C语言中,没有对结构体类型typedef,struct不可省略 return 0; }
其中,存在name,age,sex三个成员变量,用来描述结构体对象的相关属性。
s2,s3,s4就是结构体变量---全局变量。它们是具体去运用这个结构体变量,进行相关初始化之后建立的变量,可以把前面的四行代码(结构体的声明)类比为图纸,我们知道需要什么,而s2,s3,s4就是基于此建立的具体的房子。
1.3结构体的成员类型
结构的成员可以是标量(普通变量)、数组、指针,甚至是其他结构体。
//结构体的成员类型 //标量,数组,指针,甚至是其他结构体 struct A { int a; char arr[5]; int* p; }; struct B { int b; char arr1[10]; int* pp; double c; struct A AA; };
我们可以看到,在struct A中,存在int,char,指针等多种类型;在struct B中,存在int,char,指针,double,结构体等多种类型
二.结构体的初始化
创建方法:
1.声明类型的同时进行定义
2.定义
3.结构体嵌套定义
4.在main函数中定义
//结构体变量的定义和初始化 //创建 struct A { int a; char arr[5]; int* p; }A1;//声明类型的同时定义变量 struct A A2;//定义结构体变量 struct B { int b; char arr1[10]; int* pp; double c; struct A A3;//结构体嵌套定义 }; int main() { struct A A4;//在main函数中定义 return 0; }
A1是直接在声明类型处进行变量的定义,A2是直接定义结构体变量,A3是结构体嵌套定义,A4在main()函数中定义。
在创建处进行初始化。
//初始化 struct A { int a; char arr[5]; int* p; }A1 = {10,"ha",NULL};//初始化方式1 struct A A2 = { 60,"h",NULL };//初始化方式2 int main() { struct A A3 = { .arr = "haha",.a = 100,.p = NULL};//初始化方式3 printf("%d %s %p\n", A3.a, A3.arr, A3.p); return 0; }
三.结构体的成员访问
通过点操作符(.)进行结构体成员的访问。
#include<string.h> struct Stu { char name[20]; int age; }; void set_stu(struct Stu* ps) { (*ps).age = 20; //t.name = "张三";//报错 strcpy((*ps).name, "张三");//字符串拷贝,把"张三"拷贝到t.name } void print_stu(struct Stu t) { printf("%s %d\n", t.name, t.age); } int main() { struct Stu s = { 0 }; set_stu(&s); print_stu(s); return 0; }
四.结构体传参
函数传参的时候,参数是需要压栈的。
如果传递一共结构体对象的时候,结构体过大,参数压栈的系统开销较大,会导致性能下降。
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; }
在main()函数中,print1(s)传结构体,会传1000个空间。print2(&s)传地址,会传4/8个字节。