结构体
结构体的声明
结构的基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构的声明
struct tag
{
member-list;
}variable-list;
以描述学生为例:
struct Stu
{
char name[20];
int age;
char sex[5];
char id[20];
};
特殊的声明:
//匿名结构体类型
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}a[20], *p;
p = &x;该代码是错误的,因为编译器会把上面的两个声明当成完全不同的两个类型。
结构的自引用
struct Node
{
int data;//数据域
struct Node* next;//指针域
};
结构体变量的定义和初始化
struct Point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2
//初始化:定义变量的同时赋初值。
struct Point p3 = {x, y};
struct Stu //类型声明
{
char name[15];//名字
int age; //年龄
};
struct Stu s = {"zj", 20};//初始化
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化
结构体内存对齐
结构体传参
struct S
{
char arr[100];
int a;
};
//结构体传参
void print1(struct S tmp)
{
printf{ "%s %d\n",tmp.arr,tmp.a };
}
//结构体地址传参
void print2(const struct S* ps)
{
printf("%s %d\n", ps->arr, ps->a);
}
int main()
{
struct S s = { "zj",20 };
print1(s);//zj 20
print2(&s);//zj 20
return 0;
}
print2更好一些。
原因:
函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。