结构体变量和结构体变量指针作为函数形参的区别

(1)结构体变量作为函数形参的时候,实际上和普通变量(类似于int之类的)传参时的表现是一模一样的。所以说结构体变量其实也是普通变量而已。

(2)因为结构体一般都很大,所以如果直接用结构体变量进行传参,那么函数调用效率就会很低。(因为在函数传参时需要将实参赋值给形参,所以当传参的变量越大调用效率就会越低。)怎么解决?思路只有一个那就是不要传变量了,改传变量的指针(地址)进去。

(3)结构体因为自身太大,所以传参应该用结构体指针来传(但是程序员可以自己决定,你非要传结构体变量过去C语言也是允许的,只是效率低了);回想一下数组,为什么C语言设计时数组传参默认是传的数组的首元素地址而不是整个数组?因为数组一般也很大,与其传值不如传址,进而直接操作实参。

#include<stdio.h>
struct A
{
	char a;				// 结构体变量对齐问题
	int b;				// 因为要对齐存放,所以大小是8
};


void func4(struct A a1)
{
	printf("sizeof(a1) = %d.\n", sizeof(a1));		// 8
	printf("&a1 = %p.\n", &a1);					// 结构体变量a1的地址
	printf("a1.b = %d.\n", a1.b);					// 5555
}

// int main()
// {
//    struct A a = 
// 	{
// 		.a = 4,
// 		.b = 5555,
// 	};
// 	printf("sizeof(a) = %d.\n", sizeof(a));			// 8
// 	printf("&a = %p.\n", &a);					// 结构体变量a的地址
// 	printf("a.b = %d.\n", a.b);					// 5555
// 	func4(a);

// }




void func5(struct A *a1)
{
//printf("sizeof(a1) = %d.\n", sizeof(a1));		// 32位系统指针变量4个字节
printf("sizeof(*a1) = %d.\n", sizeof(*a1));		// 8
//printf("&a1 = %p.\n", &a1);				// 二重指针,指向结构体指针地址的地址
printf("a1 = %p.\n", a1);						// 结构体变量a的地址
printf("a1->b = %d.\n", a1->b);				// 5555
}



int main()
{
   	struct A a = 
	{
		.a = 4,
		.b = 5555,
	};
	printf("sizeof(a) = %d.\n", sizeof(a));		// 8 结构体变量内存对齐,占8字节空间
	//printf("sizeof(*a) = %d.\n", sizeof(*a));	// error,a本身就是一个普通结构体变量,变量的解引用是什么鬼。
	printf("&a = %p.\n", &a);			// 结构体变量a的地址
	//printf("a = %p.\n", a);				// 结构体变量a中保存的值按照%p解析而已
	printf("a.b = %d.\n\n", a.b);			// 5555
	func5(&a);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值