欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

结构体作为函数形参的归纳

程序员文章站 2022-06-22 11:26:01
主要的知识归纳来自于这位博主的CSDN博客:https://blog.csdn.net/tham_/article/details/45370607 相当于自己学习他的同时做下的笔记吧 将一个结构体变量中的数据传递给另一个函数,有下列3种方法:用结构体变量名作参数。一般较少用这种方法。用指向结构体变 ......

主要的知识归纳来自于这位博主的CSDN博客:https://blog.csdn.net/tham_/article/details/45370607

相当于自己学习他的同时做下的笔记吧

 

将一个结构体变量中的数据传递给另一个函数,有下列3种方法:
用结构体变量名作参数。一般较少用这种方法。
用指向结构体变量的指针作实参,将结构体变量的地址传给形参。
用结构体变量的引用变量作函数参数。

用实例来说明:

1 struct stu{
2     int num;
3     float score;
4 }

1. 结构体变量作为函数的参数,修改之后的成员不能返回到主调函数里  /* 虽不能返回整体,但是可以手动 return 结构体中的某一个成员  */

void func(struct stu t) { t.num=132456}   /* 如果main里定义了stu d,那么func(d)只是将d的副本传进func函数,也就是把d复制了一份传进去,所以修改不到main里的d

2.结构体数组作为函数的参数,修改之后的成员可以返回

1 void funa(struct stu t[])
/*或者是引用地址 void funa(struct stu &t) 这样效率又高又简洁。引用变量主要用作函数参数,它可以提高效率,而且保持程序良好的可读性(引用'&'是C++的新特性) 2 { 3 t[0].num=3000101; /*注意结构体数组元素的成员的引用形式*/ 4 t[0].score=81.0; 5 t[1].num=3000102; 6 t[1].score=82.0; 7 }

3.结构体指针,修改之后的成员也可以返回

1 void funb(struct stu *t)
2 {
3     t->num=123;
4     (*t).score=567.0;  //注意指针的这两种引用成员的方式
5 }

可以在main函数里分别调用以上几个函数,验证一下即可,不赘述

 

用指针引用成员的方法之一个难点

1). p=a;或p=&a[0];将结构体指针变量指向结构体数组a。则:

             ①p->num:表示通过指针变量引用结构体数组元素的成员num的值。

             ②p->num++:表示通过指针变量先引用结构体数组元素的成员num的值,再使该元素的成员num的值加 1,先引用其值然后其加1

             ③++p->num:表示使指向的元素的成员num的值加1,再引用其值。  /* 这里就考虑到->是比++高级的运算符,所以把(p->num)当作整体

2).p=a;或p=&a[0];表示将结构体指针变量p指向结构体数组a。

             ①(p++)->num:表示通过指针变量先引用结构体数组元素  的成员num的值,再使指针变量本身加1,指针变量加1表示使指针变量指向结构体数组的下一个元素。/* 指向第一个,引用完,再++指向下一个,再引用。引用两次 */

             ②(++p)->num:先使指针变量本身加1,先使使指针变量指向结构体数组的下一个元素,然后引用指针变量所指向的结构体数组元素的成员num的值。 /* 指向no.1 再++指向no.2  引用no.2,引用一次*/

 1 typedef struct str{  
 2     int len;  
 3     char s[0];  
 4   
 5     str(int k)     /*结构体内的函数,类似class
 6     {  
 7         len=k;  
 8     }  
 9   
10 }Str;  
11    
12 void make(Str tmp) // 注意当函数的形参是Str tmp 时,结构体变量调用,不影响下面tem.len的值
13 {  
14     tmp.len=2;  
15 }  
16   
17 void make_ptr(Str &tmp)  // 当函数的形参是Str &tmp,结构体地址传递,实参tem.len的值会改变
18 {  
19     tmp.len=3;  
20 }  
21   
22 void make_ptr2(Str *tmp) // 函数参数是一个Str类型的指针,传地址调用就不用说了,(上面的引用方式是C++的特性之一,C语言不能那样使用)  
23 {  
24     tmp->len=4;  
25 }  
26   
27    /* main函数的形参,我比较少注意到,可以记忆一下
28 int main(int argc, char** argv) {  
29       
30     struct str temp(1);  
31     printf("temp=%d\n",temp);  
32       
33     make(temp);  
34     printf("temp=%d\n",temp);  
35       
36     make_ptr(temp);  
37     printf("temp=%d\n",temp);  
38       
39     return 0;  
40 } 

PS:函数返回值(return) 和函数参数的返回,两个“返回”的意思是不一样的