主要的知识概括来自于这位博主的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) 和函数参数的返回,两个“返回”的意思是不同的