结构体变量、结构指针变量、结构数组作为函数的参数

结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析 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的成员num5)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。图7.103) 用结构体变量的引用作函数参数#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++系统中目前不能运行这些程序,读者可以修改程序,使之能在自己所用的系统中运行。
————————————————
版权声明:本文为CSDN博主「tham_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tham_/article/details/45370607

 

转载于:https://www.cnblogs.com/ggzhangxiaochao/p/11453172.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(求助)請問DE2-70版子 音樂合成器

您好 我是剛學習VERILOG的新手 我剛碰到一個專案 是DE2-70版子裡的 DE2_70_Music_Synthesizer 我有抓到音樂裡的音階 比如Do Re Mi Fa Sol La Ti Do等8個基本音 但有的音快有的音慢 我只能用數字來衡量他的數字或是做筆記來計入 是可以的 而且一定可以抓到 但有個問題 在程式…

英国Carmarthen Learning Centre校长Mr Stuart来华访问,与荣新IT培训中心达成教学合作关系...

英国Carmarthen Learning Centre校长Mr Stuart来华访问&#xff0c;与荣新IT培训中心达成教学合作关系 2008年9月4日&#xff0c;英国Carmarthen Learning Centre校长Mr Stuart来华访问。Carmarthen Learning Centre所处于英国伦敦&#xff0c;是一家英国著名的培训学校&#x…

win10 桌面快捷键技术

win 10 的 快捷键技术&#xff0c;使用还是挺流畅舒适的&#xff1a; Windows10技术新增键盘快捷键汇总&#xff1a; 1、贴靠窗口&#xff1a;Win 左/右> Win 上/下>窗口可以变为1/4大小放置在屏幕4个角落 2、切换窗口&#xff1a;Alt Tab(不是新的&#xff0c;但任务切…

Service Broker实现发布-订阅(Publish-Subscribe)框架

Service Broker实现发布-订阅&#xff08;Publish-Subscribe&#xff09;框架Service Broker 实现一套完整的发布-订阅方案&#xff0c;其中author 发送Service Broker Message&#xff08;又称article&#xff09;到发布者&#xff08;Publisher&#xff09;。发布者负责分发消…

设计数据服务:为报表服务提供服务接口

功能: 为报表服务提供服务接口 1.技术组件 binlog canal kafka es 2. 服务器部署规划 3.整体架构 4.参考资料:https://www.jianshu.com/p/3ebab93ff075https://www.jianshu.com/p/e841e69a5e76https://www.jianshu.com/p/5acb30ec8347https://www.jianshu.com/p/2c17c75486f3 转…

(转载)简洁、明晰!数据库设计三大范式应用实例剖析

(转载http://bbs.database.ccidnet.com/read.php?tid325895) 简洁、明晰&#xff01;数据库设计三大范式应用实例剖析 引言OL~eR{q ;iC,$vZ 0} 数据库的设计范式是数据库设计所需要满足的规范&#xff0c;满足这些规范的数据库是简洁的、结构明晰的&#xff0c;同时&#xf…

CanvasRenderingContext2D.drawImage()无效,not working

我的技术框架&#xff1a;react&#xff0c;如若不采用堵塞方式&#xff0c;即&#xff0c;const myimg await loadImage(icon28) ctx.drawImage(myimg&#xff0c;0,0, 100, 100) 而用.then()&#xff0c;如下,loadImage(icon28).then((image) > { ctx.drawImage(image,0,…

选择软路由的七大理由

linux稳定、快速、安全可靠、性能卓越&#xff01; 但在这之前&#xff0c;很多的电脑里装的都是Windows系统&#xff0c;linux系统只用在高端领域。现在网上流行的路由软件大多是基于linux系统开发&#xff0c;具有以下几点优越性&#xff1a;第一、便宜现在市面上&#xff0c…

kafka start bat

start D:\Homes\kafka_2.12-2.3.0\bin\windows\kafka-server-start.bat D:\Homes\kafka_2.12-2.3.0\config\server.properties 转载于:https://www.cnblogs.com/zeenzhou/p/11455846.html

你所应该知道的云计算

感觉像是云计算的一个推崇者&#xff0c;为云计算在做广告&#xff0c;Robyn Peterson的文章What you need to know about cloud computing。 云计算可以保证我们不再受硬件的困扰&#xff0c;真的是这样吗&#xff1f; 在为一个小型商业或者大型企业构建IT结构的时候&#xff…

递归算法

一、递归的核心思想就是自己调用自己&#xff0c;一般来说能够用递归解决的问题应满足3个条件&#xff1a; 1.需要解决的问题可以转化为一个或多个子问题来求解&#xff0c;而这些子问题的求解方法与原问题完全相同&#xff0c;只是在数量和规模上不同。 2.递归调用的次数必须是…

malloc coredump(宕)的问题

最近公司一个产品在AIX5.3上&#xff0c;运行若干天后&#xff0c;经常coredump&#xff0c;反复加日志后&#xff0c;逐渐定位到是调用strdup函数后&#xff0c;没有释放空间所导致。 在AIX5.3进行了测试&#xff0c;发现连续malloc后的现象如下&#xff1a;1&#xff…

MySQL5.5升级至5.7

一、下载免安装MySQL5.7包 下载页面 下载链接 二、替换mysql的安装目录 解压mysql5.7 tar -zxf mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz -C /usr/mysql5.7 如果之前的mysql目录是链接的方式创建的话&#xff0c;那么只需要取消链接&#xff0c;从新做一下链接就可以了 如…

Linux下如何同时启动多个Tomcat服务器

所用Tomcat服务器都为zip版&#xff0c;非安装版。以两个为例&#xff1a; 安装第二个Tomcat完成后&#xff0c;到安装目录下的conf子目录中打开server.xml文件&#xff0c;查找以下三处&#xff1a; &#xff08;1&#xff09;修改http访问端口&#xff08;默认为8080端口&…

更改临时文件夹的路径

问&#xff1a;我使用的系统为Windows XP&#xff0c;我想把系统临时文件(Temp文件)存放区由C盘移到其他分区(如D盘)&#xff0c;请问该如何操作&#xff1f;答&#xff1a;在“我的电脑”上点鼠标右键&#xff0c;选择“属性”&#xff0c;然后进入高级选项&#xff0…

解决“添加删除程序”里面隐藏问题

在C:\Windows\Inf下找到Sysoc.inf文件&#xff0c;用记事本程序打开它&#xff0c;该文件显示了当前已安装程序的部分列表。我们拿MSN Messenger来做个实验&#xff0c;在其中找到这一句“msmsgsmsgrocm.dll,OcEntry,msmsgs.inf,hide,7”&#xff0c;其中“msmsgs”是MSN Messe…

wifi移植

平台&#xff1a;全志 A40I 源码&#xff1a;Android 7.1 Linux 3.10 模块&#xff1a;AP6255 台湾正基模块&#xff0c;美国博通方案固件(系列不同&#xff0c;固件不同) 驱动(原厂提供&#xff0c;一般通用) 固件&#xff1a;Android/hardware/broadcom/wlan/bcmdhd/fir…

Cisco Adsl 详细配置

&#xff01; vpdn enable   no vpdn logging <由于ADSL的PPPoE应用是通过虚拟拨号来实现的所以在路由器中需要使用VPDN的功能   !   vpdn-group pppoe <为PPPoE启动了VPDN的进程   request-dialin   protocol pppoe <设置拨号协议为PPPoE   !   …

大规模数据如何检索?

思考&#xff1a;大规模数据如何检索&#xff1f; 如&#xff1a;当系统数据量上了10亿、100亿条的时候&#xff0c;我们在做系统架构的时候通常会从以下角度去考虑问题&#xff1a; 1&#xff09;用什么数据库好&#xff1f;(mysql、sybase、oracle、达梦、神通、mongodb、hba…

SQL 语句技巧--排名函数的使用实例

今天看到一篇文章&#xff0c;关于讨论如何优化语句&#xff0c;原文如下&#xff1a; 作者总结贴&#xff1a; http://blog.csdn.net/wangd1121/archive/2008/06/23/2579435.aspx 网友讨论贴&#xff1a; http://topic.csdn.net/u/20080504/14/5c5866c3-8b91-45ef-ab17-f994f8…