结构体做函数参数

< 上一页 结构体数组 开发库中的结构体 下一页 >

当结构体变量做函数参数的时候,我们需要注意些什么呢?大家知道,将实参传递给函数的时候,有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;

}

< 上一页 结构体数组 开发库中的结构体 下一页 >

周哥教IT,分享编程知识,提高编程技能,程序员的充电站。跟着周哥一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

当你决定关注「周哥教IT」,你已然超越了90%的程序员!

IT黄埔-周哥教IT技术交流QQ群:213774841,期待您的加入!

二维码
微信扫描二维码关注