struct node
{
int data;
struct node* next; //用指针
};
3.结构体传参
struct s
{
char name[20];
int age;
};
void print1(struct s s1)
{
printf("%s %d\n", s1.name, s1.age);
}
void print2(struct s* s1)
//struct s 就是一个类型,struct s*就相当于int* 之类的
{
printf("%s %d\n", s1->name, s1->age); //用指针就必须使用->才行,不能用"."了
}
int main()
{
struct s s1 = { "abcdef",100 };
print1(s1); //传值
print2(&s1); //传地址
return 0;
}
4.位段
(1)
struct A
{
int a : 1; //a分配1个比特位
//比如用flag==1或0来表示真假,用一个bit位就够了,可以节省空间
int b : 5; //b分配5个比特位
int c : 10; //c分配10个比特位
int d : 30; //d分配30个比特位
};
//A一共用了46个bit
//系统实际分配了8个字节(byte),相当于64个bit
int main()
{
printf("%d ", sizeof(struct A));
return 0;
}
(2)位段内存分配
struct A
{
//因为int,所以系统先分配4个字节(32bit)
int a : 1; //a分配2个比特位
int b : 5; //b分配5个比特位
int c : 10; //c分配10个比特位
//用了17个,还剩15个bit,不够放d的,所以又分配了一个int(32bit)
int d : 30; //d分配30个比特位
};
//所以系统实际分配了8个字节(byte),相当于64个bit
5.联合(共用体):这些成员共用同一块空间
(1)
union un
{
int a;
char c;
};
int main()
{
union un u;
printf("%d \n", sizeof(u)); //结果是4
printf("%p \n", &u);
printf("%p \n", &(u.a));
printf("%p \n", &(u.c));
//结果发现三个地址一样
return 0;
}
//a和c一起占用这一块空间,但是不能同时都在使用
(2)判断大小端例子
int check_sys()
{
union un
{
char c;
int i;
}u;
u.i = 1;
return u.c;
}
int main()
{
//int a=1; //0x 00 00 00 01
//低————>高
//01 00 00 00 -- 小端
//00 00 00 01 -- 大端
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
(3)联合体内存对齐
union un
{
char arr[5];
int i;
};
int main()
{
printf("%d ", sizeof(union un)); //因为int,所以5对齐成了8
return 0;
}
union un
{
short arr[7];
int i;
};
int main()
{
printf("%d ", sizeof(union un)); //因为int,所以14对齐成了16
return 0;
}