主要的知識概括來自於這位博主的CSDN博客:https://blog.csdn.net/tham_/article/details/45370607數組
至關於本身學習他的同時作下的筆記吧函數
將一個結構體變量中的數據傳遞給另外一個函數,有下列3種方法:
用結構體變量名做參數。通常較少用這種方法。
用指向結構體變量的指針做實參,將結構體變量的地址傳給形參。
用結構體變量的引用變量做函數參數。學習
用實例來講明:spa
1 struct stu{ 2 int num; 3 float score; 4 }
1. 結構體變量做爲函數的參數,修改以後的成員不能返回到主調函數裏 /* 雖不能返回總體,可是能夠手動 return 結構體中的某一個成員 */.net
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.結構體指針,修改以後的成員也能夠返回code
1 void funb(struct stu *t) 2 { 3 t->num=123; 4 (*t).score=567.0; //注意指針的這兩種引用成員的方式 5 }
能夠在main函數裏分別調用以上幾個函數,驗證一下便可,不贅述blog
用指針引用成員的方法之一個難點博客
1). p=a;或p=&a[0];將結構體指針變量指向結構體數組a。則:class
①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) 和函數參數的返回,兩個「返回」的意思是不同的