结构体做函数参数
当结构体变量做函数参数的时候,我们需要注意些什么呢?大家知道,将实参传递给函数的时候,有3种传递方式:传值,传指针,和传引用。
由于结构体数据成员一般都会多余1个,因此占用的内存一般都比较大,所以,在传值的时候,拷贝到栈上的数据(每个成员)就会很多,因此效率会比较低下。因此结构体传参,一般都不推荐使用传值而使用传指针或者传引用,如果传指针或者传引用,那么只需要拷贝4个字节的地址(X86平台)或者8个字节的地址(X64平台中64位程序)到栈上。
比如下面用于比较2个学生成绩是否相等的例子:
typedef struct _student
{
int score;
char name[20];
}student, *pstudent;
1,传值:
int compare_student_score1(student s1,student s2)
{
return s1.score-s2.score;
}
2,传指针:
int compare_student_score2(pstudent s1, pstudent s2)//pstudent==student *
{
if(s1==NULL || s2==NULL)
{
return 0;
}
return s1->score-s2->score;
}
int _tmain(int argc, _TCHAR* argv[])
{
student stu1={99,"tom"};
student stu2={97,"lily"};
//传值:
int result = compare_student_score1(stu1,stu2);//stu1,stu2的各个成员都会拷贝到栈上
if(result>0)
{
printf("%s is better than %s\n", stu1.name,stu2.name);
}
else if (result==0)
{
printf("%s is equal to %s\n", stu1.name,stu2.name);
}
else
{
printf("%s is worse than %s\n", stu1.name,stu2.name);
}
printf("stu1.score:%d\n", stu1.score);
//传指针
result = compare_student_score2(&stu1,&stu2);//只需要把stu1和stu2的地址拷贝到栈上
if(result>0)
{
printf("%s is better than %s\n", stu1.name,stu2.name);
}
else if (result==0)
{
printf("%s is equal to %s\n", stu1.name,stu2.name);
}
else
{
printf("%s is worse than %s\n", stu1.name,stu2.name);
}
return 0;
}