c语言结构体

1.结构体内存对齐

 2.结构体的自引用

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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

对玛导至昏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值