对于初学C语言的同学来说,结构体传参是一件值得我们考虑的问题,传参的时候我们会想,是传值好呢?还是传址好?
接下来我们讨论一下这个问题
举个例子:
我们首先先创建一个结构体
struct Stu
{
char name[1000];
int num;
int age;
};
接下来我们创建一个结构体变量:
struct Stu s = { "zhangsan", 12345, 18 };
我们考虑打印出来结构体的成员,我们可以封装两个函数分别叫print1与print2
print1---------->用来传值打印
print2---------->用来传址打印
接下来我们实现这两个函数
print1
void print1(struct Stu ss)
{
printf("%s %d %d\n", ss.name, ss.num, ss.age);
}
完整代码如下:
#include <stdio.h>
void print1(struct Stu ss)
{
printf("%s %d %d\n", ss.name, ss.num, ss.age);
}
int main()
{
struct Stu s = { "zhangsan", 12345, 18 };
print1(s);//传值 打印结构体的数据
return 0;
}
结果如下
接下来我们实现print2 通过传址调用此函数
print2
void print2(struct Stu* ps)
{
printf("%s %d %d\n", ps->name, ps->num, ps->age);
}
int main()
{
struct Stu s = { "zhangsan", 12345, 18 };
print2(&s);//传址 打印结构体数据
return 0;
}
结果如下 一模一样的结果
这是不禁出现了疑问,同样都能达到打印结构体数据的效果,那么是传值好还是传址好呢?
在传值时,形参是实参的一份临时拷贝,它会在栈区开辟一块新的空间,在结构体传参时,如果结构体过大,开辟空间也就随之增大,在空间与时间上来说,开销比较大。
传址时,地址在32位平台占4个字节,64位平台占8个字节,相对于结构体所占字节而言要少。
函数在传参时,参数需要压栈,如果传递的一个结构体过大,参数压栈的系统开销较大,导致性能下降。
综上所述 结构体传参时,应优先考虑传结构体的地址。
感谢观看。
完整代码如下:
struct Stu
{
char name[1000];
int num;
int age;
};
#include <stdio.h>
void print1(struct Stu ss)
{
printf("%s %d %d\n", ss.name, ss.num, ss.age);
}
void print2(struct Stu* ps)
{
printf("%s %d %d\n", ps->name, ps->num, ps->age);
}
int main()
{
struct Stu s = { "zhangsan", 12345, 18 };
print1(s);//传值 打印结构体的数据
print2(&s);//传址 打印结构体数据
return 0;
}