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