下面的两个函数是 print1 好 还是 print2 好?
struct Point
{
int x;
int y;
}p1 = { 10,15 };
sp;
struct S
{
char c;
struct Point sp;
double d;
char arr[20];
};
//void print1(struct S s) //s 是 结构体 struct S 的重命名
//{
// printf("%c\n", s.c); //即找到的是 w
// printf("%d %d\n", s.sp.x, s.sp.y); //即找到的是 100 20
// printf("%1f\n", s.d);
// printf("%s\n", s.arr);
//}
print2(struct* ps)
{
printf("%c\n", ps->c);
printf("%d %d\n", ps->sp.x, ps->sp.y);
printf("%1f\n", ps->d);
printf("%s\n", ps->arr);
}
int main()
{
struct Point p = { 100,200 }; //对第一个结构体的初始化
struct S ss = { 'w',{100,20},5.5,"hellow" }; //对第二个结构体的初始化
//printf("%c\n", ss.c); //即找到的是 w
//printf("%d %d\n", ss.sp.x, ss.sp.y); //即找到的是 100 20
//printf("%1f\n", ss.d);
//printf("%s\n", ss.arr);
ss.c = 'b';
ss.sp.x = 1000;
ss.sp.y = 2000;
ss.d = 3.14;
strcpy(ss.arr, "world"); //strcpy字符串拷贝
//print1(ss); //打印struct S 类型的变量 传值 占用的内存很大
print2(&ss); //传地址,占用的内存很小。只是四个字节或者八个字节的内存。
return 0;
}
答案:选择 print2
函数在传参的过程中,参数是需要压栈的。
如果传递一个结构体对象的时候 ,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。
结论:结构体在传参的时候,要穿结构体的地址。
int Add(int x, int y)
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int a = 10;
int b = 20;
int c = 0;
c = Add(a, b);
return 0;
}
每一次函数的调用,都需要在栈区开辟一下空间。
传参是从右往左传的,先传右边,后传左边。