结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析

    struct stud{long int num;float score;};

/*结构体变量作为函数的参数,修改之后的成员值不能返回到主调函数*/

    void funvr(struct stud t){t.num=2000101;t.score=71.0;}

/*结构体数组作为函数的参数,修改后的元素的成员值能返回到主调函数*/

    void funar(struct stud t[])//void funar(struct stud &t){t[0].num=3000101;         /*注意结构体数组元素的成员的引用形式*/t[0].score=81.0;t[1].num=3000102;t[1].score=82.0;}

/*结构体指针变量作为函数的参数,修改后的结构体成员的值能返回到主调函数*/

    void funpr(struct stud *t){t->num=4000101;          /*注意通过结构体指针变量引用成员的具体形式*/(*t).score=92.0;}

/*在主函数中分别调用上述函数修改成员值,再验证结果的正确性*/

    #include<stdio.h>struct stud{long int num;float score;};void funvr(struct stud t){t.num=2000101;t.score=71.0;}void funar(struct stud t[])//void funar(struct stud &t){t[0].num=3000101;         /*注意结构体数组元素的成员的引用形式*/t[0].score=81.0;t[1].num=3000102;t[1].score=82.0;}void funpr(struct stud *t){t->num=4000101;          /*注意通过结构体指针变量引用成员的具体形式*/(*t).score=92.0;}void main(){struct stud a[2]={{1000101,61.0}, {1000102,62.0}};struct stud    b=a[0],*p;printf("old b: b.num:%ld\tb.score:%f\n",b.num,b.score);/*显示结构体变量b的成员的原有值*/funvr(b);/*验证第一种情况,观察并分析结果,看结构体变量作为函数参数时,形参结构体变量成员的值的改变能影响实参结构体变量的成员的值,以下为输出调用函数funvr(b)之后的结果值*/printf("call funvr() new b: b.num:%ld\tb.score:%f\n ",b.num,b.score);funpr(&b);            /*将结构体变量的指针对作为函数的参数*/printf("call funpr() new b: b.num:%ld\tb.score:%f\n ",b.num,b.score);/*输出结构体数组a元素的原来的成员值*/printf("old a[0]:a[0].num:%ld\ta[0].score:%f\n ",a[0].num,a[0].score);printf("old a[1]:a[1].num:%ld\ta[1].score:%f\n ",a[1].num,a[1].score);/*将结构体数组a作为函数的参数,然后再输出其元素的成员的值,已经被修改了*/funar(a);printf(" new a[0]:a[0].num:%ld\ta[0].score:%f\n ",a[0].num,a[0].score);printf("new a[1]:a[1].num:%ld\ta[1].score:%f\n ",a[1].num,a[1].score);}

【结构体参数调用归纳】

1)结构体变量作为函数参数[实参与形参]时,形参结构体变量成员值的改变不影响对应的实参构体变量成员值的改变。

2)结构体数组或结构体指针变量作为函数参数[实参与形参]时,形参结构体数组元素[或形参结构体指针变量指向的变量]成员值的改变将影响对应的实参构体数组[或实参结构体指针变量指向的变量]成员值的改变。

3)结构体变量可作为函数的参数,函数可返回一结构体类数据

4)p=&b; 使结构体指针变量p指向结构体变量b的空间。

p->num:表示通过指针变量引用结构体变量b的成员num

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

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

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

③++p->num:表示使指向的元素的成员num的值加1,再引用其值。

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

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

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


结构体变量作为函数的形式参数实验总结

#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct str{int len;char s[0];str(int k){len=k;}}Str;void make(Str tmp) // 注意当函数的形参是Str tmp 时,传递的方式是普通的结构体变量传值调用,这里让len的值改变不会影响下面的temp的len{tmp.len=2;}void make_ptr(Str &tmp)  // 当函数的形参是Str &tmp,时传递的是结构体的地址,当这里使得tmp.len值改变时,实参temp.len值也会改变{tmp.len=3;}void make_ptr2(Str *tmp) // 函数参数是一个Str类型的指针,传地址调用就不用说了,(上面的引用方式是C++的特性之一,C语言不能那样使用){tmp->len=4;}int main(int argc, char** argv) {struct str temp(1);printf("temp=%d\n",temp);make(temp);printf("temp=%d\n",temp);make_ptr(temp);printf("temp=%d\n",temp);return 0;}

结构体变量作为函数参数传递的3种方法

将一个结构体变量中的数据传递给另一个函数,有下列3种方法:

  • 用结构体变量名作参数。一般较少用这种方法。
  • 用指向结构体变量的指针作实参,将结构体变量的地址传给形参。
  • 用结构体变量的引用变量作函数参数。

下面通过一个简单的例子来说明,并对它们进行比较。
【例7.5】有一个结构体变量stu,内含学生学号、姓名和3门课的成绩。要求在main函数中为各成员赋值,在另一函数print中将它们的值输出。

1) 用结构体变量作函数参数。

 #include <iostream>#include <string>using namespace std;struct Student//声明结构体类型Student{int num;char name[20];float score[3];};int main( ){void print(Student); //函数声明,形参类型为结构体StudentStudent stu; //定义结构体变量stu.num=12345; //以下5行对结构体变量各成员赋值stu.name="Li Fung";stu.score[0]=67.5;stu.score[1]=89;stu.score[2]=78.5;print(stu); //调用print函数,输出stu各成员的值return 0;}void print(Student st){cout<<st.num<<" "<<st.name<<" "<<st.score[0]<<" " <<st.score[1]<<" "<<st.score[2]<<endl;}运行结果为:12345 Li Fung 67.5 89 78.5 (2)

2)用指向结构体变量的指针作实参在上面程序的基础上稍作修改即可。

 #include <iostream>#include <string>using namespace std;struct Student{int num; string name; //用string类型定义字符串变量float score[3];}stu={12345,"Li Fung",67.5,89,78.5}; //定义结构体student变量stu并赋初值int main( ){void print(Student *); //函数声明,形参为指向Student类型数据的指针变量Student *pt=&stu; //定义基类型为Student的指针变量pt,并指向stuprint(pt); //实参为指向Student类数据的指针变量return 0;}//定义函数,形参p是基类型为Student的指针变量void print(Student *p){cout<<p->num<<" "<<p->name<<" "<<p->score[0]<<" " <<p->score[1]<<" "<<p->score[2]<<endl;}

调用print函数时,实参指针变量pt将stu的起始地址传送给形参p(p也是基类型为student的指针变量)。这样形参p也就指向stu,见图7.10。
在print函数中输出p所指向的结构体变量的各个成员值,它们也就是stu的成员值。在main函数中也可以不定义指针变量pt,而在调用print函数时以&stu作为实参,把stu的起始地址传给实参p。

3) 用结构体变量的引用作函数参数

    #include <iostream>#include <string>using namespace std;struct Student{int num;string name;float score[3];}stu={12345,"Li Li",67.5,89,78.5};int main( ){void print(Student &);//函数声明,形参为Student类型变量的引用print(stu);//实参为结构体Student变量return 0;}//函数定义,形参为结构体Student变量的引用void print(Student &stud){cout<<stud.num<<" "<<stud.name<<" "<<stud.score[0]<<" " <<stud.score[1]<<" "<<stud.score[2]<<endl;}

程序(1)用结构体变量作实参和形参,程序直观易懂,效率是不高的。
程序(2)采用指针变量作为实参和形参,空间和时间的开销都很小,效率较高。但程序(2)不如程序(1)那样直接。
程序(3)的实参是结构体Student类型变量,而形参用Student类型的引用,虚实结合时传递的是stu的地址,因而效率较高。它兼有(1)和(2)的优点。

引用变量主要用作函数参数,它可以提高效率,而且保持程序良好的可读性(引用'&'是C++的新特性)。在本例中用了string方法定义字符串变量,在某些C++系统中目前不能运行这些程序,读者可以修改程序,使之能在自己所用的系统中运行。

————————————————
转载于 (struct)结构体变量作为函数参数调用的方法小结_Tham 在思索中前行!-CSDN博客_结构体数组作为函数参数传递

C++ | (struct)结构体变量作为函数参数调用的方法小结相关推荐

  1. c语言结构体作为形参是否加struct_(struct)结构体变量作为函数参数调用的方法小结...

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

  2. c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...

    C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...

  3. 结构体和结构体指针作为函数参数的区别

    0·说明 文章里的观点来自网络的总结,程序经过自己的验证,在VC6.0中可正常执行. 1.测试程序 /* ##结构体指针与结构体变量用作函数参数区别:##结构体指针作为函数参数时,调用时传递的是指向一 ...

  4. C语言数组、结构体、结构体数组作为函数参数

    数组作为函数参数 如果想把一个数组名参数传递给函数,正确的函数形参应该是怎样的?它是应该声明为一个指针还是一个数组? 调用函数时实际传递的是一个指针,所以函数的形参实际上是一个指针,但为了使程序员新手 ...

  5. 【C 语言】结构体 ( 结构体 数组 作为函数参数 | 数组 在 堆内存创建 )

    文章目录 一.结构体 数组 作为函数参数 ( 数组 在 堆内存创建 ) 二.完整代码示例 一.结构体 数组 作为函数参数 ( 数组 在 堆内存创建 ) 在上一篇博客 [C 语言]结构体 ( 结构体 数 ...

  6. 【C 语言】结构体 ( 结构体作为函数参数 | 结构体指针作为函数参数 )

    文章目录 一.结构体作为函数参数 二.结构体指针作为函数参数 三.完整代码示例 一.结构体作为函数参数 结构体变量 作为函数形参 , 在函数中 , 只能访问 该函数形参 , 无法修改 结构体内存 的值 ...

  7. 【C 语言】结构体 ( 结构体 数组 作为函数参数 | 数组 在 栈内存创建 )

    文章目录 一.结构体 数组 作为函数参数 ( 数组 在 栈内存创建 ) 二.完整代码示例 一.结构体 数组 作为函数参数 ( 数组 在 栈内存创建 ) 声明结构体类型 : 定义 结构体 数据类型 , ...

  8. struct结构体扩展-成员函数

    struct结构体扩展-成员函数 在C++中,允许在结构中定义函数,该函数被称为成员函数,描述形式如下: struct 结构名{数据成员成员函数 } 例题描述: 输入n个学生的信息,每个学生信息包括姓 ...

  9. c语言 结构体指针做函数参数

    demo:修改某个学生的成绩 不利用指针直接在主函数内修改学生成绩的代码: #include <stdio.h> #include <string.h> #define N 5 ...

  10. C++_结构体指针_嵌套结构体_结构体做为函数参数_结构体值传递和指针传递---C++语言工作笔记026

    然后我们来看结构体指针. 可以看到我们先去定义一个结构体 然后我们在main函数中,去声明一个结构体 s 然后我们定义一个指针 int *p = &s; 指向这个结构体变量. 这里要注意

最新文章

  1. 全面探索 FreeMarker 模版引擎的扩展性
  2. SQL SERVER 打开脚本报“未能完成操作,存储空间不足”
  3. [mybatis]映射文件_select_resultMap_discriminator鉴别器
  4. 为什么要使用信道复用技术?常用的信道复用技术有哪些?
  5. Date对象在Android和IOS上的兼容
  6. 列表显示新闻等信息,添加新消息图标
  7. python画简便的图-如何用python画M集(1)——M集原始图的画法
  8. linux环境下的c++编程
  9. Google C++测试框架系列高级篇:第一章 更多关于断言的知识
  10. ubuntu多显示器单触摸屏校准
  11. 基本矩阵F和本质矩阵E的详细推导
  12. 记录一次keil调试过程:自动识别GPS厂家芯片
  13. html5梯形图形代码,CSS秘密花园:梯形标签
  14. .so has text relocations. This is wasting memory and prevents security hardening. Please fix.
  15. java 内存回收参数_JVM内存模型及垃圾回收的研究总结
  16. Word文档插入图片的问题
  17. Java批量导出word压缩后的zip文件
  18. 2021 互联网公司时薪排行榜出炉!微软、美团很强!
  19. 一个开源vue网站博客,nuxt开源网站,前后端分离项目 1
  20. 【源码安装python3.8】

热门文章

  1. VMware vSphere中资源池介绍
  2. 恢复U盘空间大小的方法
  3. 伍斯特理工学院计算机硕士怎么样,美国伍斯特理工学院研究生专业排名如何?...
  4. 传统Tier1“大象转身”:不够快?你永远没有机会
  5. Python写个小游戏:看图猜成语(下)
  6. 如何看懂公司的财务报表(1)
  7. SPSS单因素方差分析
  8. 微信公众号文章的爬取(搜狗微信搜索)
  9. c#中datagridview清空数据并删除空白行
  10. 微信商户中查看 appid