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

article/2025/6/18 3:23:24

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

    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博客_结构体数组作为函数参数传递


http://chatgpt.dhexx.cn/article/gNHwyq0H.shtml

相关文章

[C++]试一试结构体struct node的构造函数

可直接点击跳转到构造函数处 结构体概念定义结构体定义结构体及结构体变量结构体变量的特点成员调用成员函数调用 结构体的构造函数Upd1Upd2Upd3 结构体概念 在实际问题中&#xff0c;一组数据往往具有不同的数据类型。 例如&#xff1a;人口大普查时&#xff0c;需要记录每一…

struct构造函数 c++

(做到了一个题目&#xff0c;题目本身不重要&#xff0c;就是看到了大佬的代码&#xff0c;用了struct的神奇语法&#xff0c;这样一来代码十分简洁&#xff0c;看着舒服。) //待我学会了再来ಠ_ರೃ2021.2.7日晚 啊我好像会了QwQ 在struct内部写构造函数&#xff0c;实现str…

c++中struct构造函数

构造函数&#xff0c;说白了&#xff0c;就是初始化。 具体的打法是这个样子的&#xff1a; struct node{//构造函数node()//形参表{//内容} };例子&#xff1a; struct node{node(int c){xc;yz0;}int x,y,z; };当然&#xff0c;他既然作为一个函数&#xff0c;那么在里面自然…

MATLAB struct函数(结构体数组)

文章目录 语法说明输入参数示例例1: 在结构体中存储相关数据变量例2: 具有一个字段的结构体例3: 具有多个字段的结构体例4: 带有空字段的结构体例5: 包含元胞数组的字段例6: 空结构体例7: 嵌套结构体 语法 s struct s struct(field,value) s struct(field1,value1,...,fiel…

等价无穷小的替换条件

等价无穷小的替换条件&#xff1a; 拓展&#xff1a; 常用等价无穷小&#xff1a;x趋于0时&#xff0c;x和sinx是等价无穷小&#xff1b;sinx和tanx是等价无穷小&#xff1b;tanx和ln(1x)是等价无穷小&#xff1b;ln&#xff08;1x&#xff09;和ex-1是等价无穷小&#xff1b;…

常见的几个等价无穷小

当时有&#xff1a; 1、sinx~x 2、tanx~x 3、arcsinx~x 4、arctanx~x 5、ln(1x)~x 6、~x 7、~ 8、~ax 9、~xlna 补充&#xff1a; 1、等价无穷小的定理&#xff1a;两个无穷小之比的极限为1&#xff1b; 2、等价代换适用于因子&#xff0c;不适用于代数式中的和差&…

等价无穷小替换及其习题 笔记

等价无穷小替换https://www.bilibili.com/video/BV1eU4y1F7W4/?spm_id_from333.788.recommend_more_video.1 幂函数等价无穷小替换尤为重要 下列基本公式及其定理&#xff1a; 在求极限x趋于0&#xff0c;洛必达前先看有没有等价无穷小替换的机会 推广形式&#xff1a; 注意…

高数常用等价无穷小

高数常用等价无穷小公式 图源网络常用公式泰勒公式快乐&#xff01; 图源网络 我强调一下&#xff0c;图片来自网络&#xff0c;我只负责用ps加工一下&#xff0c;得到没用重复的公式然后做成自己的工具&#xff0c;没有其他意思 常用公式 泰勒公式 快乐&#xff01;

微积分 | 常用等价无穷小的整理 | 清晰

当 x → 0 x\to 0 x→0 时 sin ⁡ x ∼ x tan ⁡ x ∼ x ln ⁡ ( 1 x ) ∼ x e x − 1 ∼ x arcsin ⁡ x ∼ x arctan ⁡ x ∼ x log ⁡ a ( 1 x ) ∼ x ln ⁡ x a x − 1 ∼ ln ⁡ a ⋅ x 1 − cos ⁡ x ∼ 1 2 x 2 ( 1 x ) n − 1 ∼ x n \begin{aligned} &\sin x\si…

math_证明常用等价无穷小泰勒展开案例代换

文章目录 等价无穷小和泰勒公式常用等价无穷小泰勒公式&等价无穷小求解极限 无穷小量无穷小量的比较无穷小的阶(相对阶)利用等价无穷小来计算极限(代换原则)等价无穷小充要条件 常用的等价无穷小和推导 sin ⁡ ( x ) ∼ x \sin(x)\sim x sin(x)∼x t a n ( x ) ∼ x tan(x)…

vue-router 路由的懒加载原理及方式

当打包构建应用时&#xff0c;JavaScript 包会变得非常大&#xff0c;影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块&#xff0c;然后当路由被访问的时候才加载对应组件&#xff0c;这样就更加高效了。 结合 Vue 的异步组件和 Webpack 的代码分割功能&#…

JPA/hibernate懒加载原理分析及JSON格式API反序列化时连环触发懒加载问题的解决

什么是懒加载 JPA是java持久层的API&#xff0c;也就是java官方提供的一个ORM框架&#xff0c;Spring data jpa是spring基于hibernate开发的一个JPA框架。Spring data jpa提供了大量的数据库操作接口&#xff0c;以及采用动态代理的方式做的以接口方法命名的数据库操作方式&…

react性能优化-懒加载原理

编译阶段的优化 开发阶段构建更快 loader的include和exclude属性 {test: /.(j|t)sx?$/,use: [{loader: "thread-loader",},{loader: "babel-loader",options: {presets: [["babel/preset-env", { modules: false }], //es6->es5"babe…

js图片懒加载原理、实现及节流优化

1.懒加载原理 在图片没有进入可视区域时&#xff0c;先给的src一个默认加载的图片&#xff0c;这样浏览器就不会发送请求了&#xff0c;等到图片进入可视区域再把真实的图片路径data-src给src。 2.具体实现 1. 效果 2. 代码如下&#xff1a; <style>.imgList{width:…

html图片懒加载,图片懒加载原理及实现

原理&#xff1a; 先将img标签的src链接设为同一张图片(比如空白图片)&#xff0c;然后给img标签设置自定义属性(比如 data-src),然后将真正的图片地址存储在data-src中&#xff0c;当JS监听到该图片元素进入可视窗口时&#xff0c;将自定义属性中的地址存储到src属性中。达到懒…