結構體作為函數形參的歸納


主要的知識歸納來自於這位博主的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) 和函數參數的返回,兩個“返回”的意思是不一樣的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM