目录
结构体
结构体介绍
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构体声明
1.比如描述一个学生
//描述一个学生的结构体
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;
1.匿名结构体变量只能在结构体声明后定义一次
//匿名结构体为“一次性用品”
struct
{
int a;
char b;
float c;
}n1,n2;
struct n3;//错误,匿名结构体只能在声明的时候定义变量
2.两个成员相同的匿名结构体,是不同类型的
结构体变量的定义
//结构体变量的定义
struct Point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2
p1和p2完全等价,为两个不同的结构体变量
//两个成员相同的匿名结构体,是不同类型的
//匿名结构体声明
struct
{
int a;
char b;
float c;
}s1;
struct
{
int a;
char b;
float c;
} *p;
int main()
{
p = &s1;//不成立的,虽然两个匿名结构体成员相同,但是系统会认为两个结构体是不同类型的
return 0;
}
结构体变量的初始化
//结构体变量的定义
struct Point
{
int x;
int y;
}p1;
//初始化:定义变量的同时赋初值
struct Point p1 = {1,2};
//先定义结构体
struct Stu
{
char name[15];//姓名
int age; //年龄
};
//后定义结构体变量再初始化
struct Stu s = { "zhang san",20 };
结构体变量的嵌套初始化
//定义一个结构体
struct Point
{
int x;
int y;
};
//再定义一个结构并嵌套前一结构体
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = { 10,{1,2},NULL};//结构体嵌套初始化
结构体传参
//结构体初始化
struct S
{
int data[100];
int num;
};
struct S s = { {1,2,3,4},100 };
//结构体传参
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);//结构体地址传参
}
1.上面的 print1 和 print2 函数哪个好些?
答案是:首选print2函数。 原因:函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
2.结论: 结构体传参的时候,要传结构体的地址。
位段
介绍位段
位段的声明和结构体类似,有两个不同:
1.位段成员必须是unsigned int ,int 或 signed int.
2.位段的成员后边有一个冒号和一个数字,例如L: int a: 2; 意思是a只需要两个2进制位
位段的内存分配
1.位段的成员可以是unsigned int ,int 或 signed int或者char(属于整型家族)
2.位段在空间上以4个字节(int)和一个字节(char)的方式来开辟,看位段成员类型
3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
*位段内存存储分析
1.
2.