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

2023-05-16

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

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); //函数声明,形参类型为结构体Student
   Student 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,并指向stu
   print(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.10
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++系统中目前不能运行这些程序,读者可以修改程序,使之能在自己所用的系统中运行。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(struct)结构体变量作为函数参数调用的方法小结 的相关文章

  • awk 筛选并计算时间

    grep 39 filter cost time 39 log file awk F 39 filtered route count 39 39 print 2 39 awk F 39 39 39 print 1 39 awk 39 BEG
  • 忽略批处理中的pause命令

    当存在一个批处理文件 run bat xff0c 其中 xff1a 64 echo 开始暂停 pause 64 echo 暂停结束 当我们执行这个run bat文件时 xff0c 运行到pause会提示需要按任意键继续 xff0c 并且命令
  • BullseyeCoverage 代码覆盖度检查工具

    昨日又有同事问我 BullseyeCoverage 的使用方法 xff0c 由于时间久远 xff0c 有些遗忘 xff0c 只后悔当初为什么没有整理记录下来 xff0c 只好重新查阅了很多文档 今日整理下比较重要的知识 xff0c 方便以后
  • 用于词义消岐的Lesk算法

    该算法由Michael E Lesk于1986年提出 xff0c 是一个基于词典的词义消岐方法 该算法认为 xff1a 一个词在词典中的词义解释与该词所在句子具有相似性 这种相似性可以由相同单词的个数来表示 xff0c 比如 cone 和
  • 通过cmake打印CMakeLists.txt中的宏

    转 cmake中宏的使用 原文路径 https blog csdn net qq 29573053 article details 80392441 首先贴一个例子进行分析 set var 34 ABC 34 macro Moo arg m
  • undefined reference to `vtable for XXXXX`

    vtable 表示的是虚表 这个错误出现时 请检查你的父类所有虚函数是否实现 或者子类是否把父类的虚函数都处理完 注意 析构函数也算
  • CMakeLists.txt ----find_package

    在linux平台下编译程序的时候通常都会使用到CMakeLists txt来制定编译规则 在查找需要链接的lib时候 通常会使用到find package 记录一下我之前用到的地方 find package 之后 最好到FindXXX cm
  • opencv学习笔记1 opencv安装及配置 一劳永逸不需要每次都重新配置

    opencv2 4 9地址 xff1a https sourceforge net projects opencvlibrary files opencv win 2 4 9 opencv 2 4 9 exe download vs2013
  • 【Linux学习笔记】关于ubuntu开机菜单栏和任务栏不见了的有效解决方法

    一 问题描述 ubuntu开机只有桌面 xff0c 没有菜单栏和任务栏 xff0c 如下图 xff1a 二 问题解决 刚学习ubuntu xff0c 总有些像我这样不折腾就不舒服的人 xff0c 今天改了一下主题 xff0c 图标什么的 x
  • 【数据结构与算法】深入浅出递归和迭代的通用转换思想

    深入浅出递归和迭代的通用转换思想 一般来说 xff0c 能用迭代的地方就不要用递归 xff01 理论上讲 xff0c 所有的递归和迭代之间都能相互转换 xff01 刷题碰到 一天一道LeetCode 130 Surrounded Regio
  • 【unix网络编程第三版】阅读笔记(二):套接字编程简介

    unp第二章主要将了TCP和UDP的简介 xff0c 这些在 TCP IP详解 和 计算机网络 等书中有很多细致的讲解 xff0c 可以参考本人的这篇博客 计算机网络 第五版 阅读笔记之五 xff1a 运输层 xff0c 这篇博客就不再赘述
  • 带你深入理解STL之Deque容器

    在介绍STL的deque的容器之前 xff0c 我们先来总结一下vector和list的优缺点 vector在内存中是分配一段连续的内存空间进行存储 xff0c 其迭代器采用原生指针即可 xff0c 因此其支持随机访问和存储 xff0c 支
  • 带你深入理解STL之Set和Map

    在上一篇博客 带你深入理解STL之RBTree中 xff0c 讲到了STL中关于红黑树的实现 xff0c 理解起来比较复杂 xff0c 正所谓前人种树 xff0c 后人乘凉 xff0c RBTree把树都种好了 xff0c 接下来就该set
  • 一个小时开发的直播推拉流软件来了

    一 简介 目前市面上直播推流的软件有很多 xff0c 拉流也很常见 近期因为业务需要 xff0c 需要搭建一整套服务端推流 xff0c 客户端拉流的程序 随即进行了展开研究 xff0c 花了一个小时做了个基于winfrom桌面版的推拉流软件
  • Redis源码剖析--字符串t_string

    前面一直在分析Redis的底层数据结构 xff0c Redis利用这些底层结构设计了它面向用户可见的五种数据结构 xff0c 字符串 哈希 xff0c 链表 xff0c 集合和有序集合 xff0c 然后用redisObject对这五种结构进
  • Redis源码剖析--快速列表quicklist

    在RedisObject这一篇博客中 xff0c 有介绍到list结构的底层编码类型有OBJ ENCODING QUICKLIST xff0c 当时就发现这个底层数据结构被我遗漏了 昨天花了点时间补了补这个知识 xff0c 看完发现这货就跟
  • Redis源码剖析--列表list

    上一篇博客Redis源码剖析 快速列表 带大家一起剖析了quicklist这个底层数据结构的实现原理 Redis对外开放的列表list结构就是采用quicklist作为底层实现 xff08 在新版本的Redis源码中 xff0c 不再采用z
  • PX4二次开发(一:PX4架构)

    概念 本节包含有关PX4系统架构和其他核心概念的主题 目录 PX4架构 PX4飞行栈架构 事件接口 飞行模式 飞行任务 控制分配 xff08 混控Mixing xff09 PWM限制状态机 系统启动 PX4 SD卡布局 PX4系统架构 以下
  • ssh登录警告 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

    1 ssh远程登录警告提示信息如下 xff1a span class token function ssh span th 64 192 168 162 136 64 64 64 64 64 64 64 64 64 64 64 64 64
  • 在Mac上使用Dronekit与SITL做飞行程序的模拟调试

    背景 无人机的项目快要中期答辩了 xff0c 为了在地面站 xff08 电脑 xff09 控制无人机 xff0c 我们选择DroneKit来进行代码的书写 DroneKit是一个专门用于控制无人机的Python库 xff0c 使用这个API

随机推荐

  • 敏捷教练的十种能力

    1 具备神奇的 读懂一个房间 的能力 只要走进一个房间 xff0c 就能判断出不在的过程中 xff0c 房间里发生了什么事情 xff0c 能立即读出空气中蕴含的情绪 xff0c 从而判断是否一切正常 xff1b 2 关心人本身胜过关心产品
  • kubernetes: HPA解析

    什么是HPA Horizontal Pod Autoscaling可以根据指标自动伸缩一个Replication Controller Deployment 或者Replica Set中的Pod数量 HPA的工作模型 有哪些指标 目前主要分
  • ROS中生成CameraInfo消息

    前言 由于某个第三方代码需要接受CameraInfo消息 xff0c 我换了一个相机以后 xff0c 需要自己发布CameraInfo消息 网上搜了半天 xff0c 很少有介绍CameraInfo这些数据都是怎么来的的资料 xff0c 可能
  • OpenCV+aruco 生成标定格与相机位姿计算

    仅用于记录自己使用aruco过程中遇到的问题与解决方法 0 参考资料 github一个参考 xff1a https github com opencv opencv contrib blob master modules aruco sam
  • 计算机和控制领域SCI收录期刊及其影响因子

    来源 xff1a http hi baidu com daren007 blog item 0605ed97b1c50e6a55fb9608 html 031 Computer Applications amp Cybernetics No
  • 【学习总结】Kalibr标定相机与IMU

    本文仅用于记录自己学习过程 使用方法 Kalibr包括 xff1a 相机内参 xff0c 多相机外参 xff0c 已知IMU和相机内参的 相机与IMU标定 xff0c 以及扩展Kalibr支持IMU内参标定 当已知IMU内参和相机内参后 x
  • 【学习记录】Kalibr标定相机与IMU的一点记录

    一周更多的时间在搞这个Kalibr的相机与IMU的标定 xff0c 记录一些问题 xff1a 相机重投影误差 相机一定要好好标定 xff0c 如果重投影误差太大 xff0c 是优化不出来外参的 好在相机内参 xff0c 与IMU外参标定 x
  • 【学习总结】VIO初始化学习1:Monocular Visual–Inertial State Estimation With Online Initialization and Camera–IMU

    最近看了一篇论文 xff0c 很是头大 xff0c 大概看懂了个所以然 记录一下 论文 xff1a Monocular Visual Inertial State Estimation With Online Initialization
  • PYTHON用法第一篇:print的用法。

    hello大家好 xff0c 我是会编程的杜子腾 xff0c 今天我们来学习一下python实例 xff1a print用法 使用材料 xff1a 一台电脑 python各版本 随便一个 xff0c 尽量选python3 python文本编
  • 那些女程序员们的故事

    点击上方蓝字 关注我们 xff0c 和小伙伴一起聊技术 xff01 程序媛是程序员大军中一道美丽的风景线 xff0c 今天的这篇文章就选取了一些女程序员们的故事 xff0c 希望当所有人了解了他们的经历后 xff0c 能让这个 重男轻女 的
  • shell中脚本变量和函数变量的作用域

    原文地址 xff1a http blog csdn net ltx19860420 article details 5570902 1 shell脚本中定义的变量是global的 xff0c 其作用域从被定义的地方开始 xff0c 到she
  • 最简单易懂的10堂算法入门课——算法是什么

    算法太重要了 人工智能 xff0c 机器学习 xff0c 大数据 xff0c 这些越来越常听到的字眼 xff0c 背后其实都是一个个 算法 诸多高新科技 xff0c 似乎都离不开 算法 的 加持 科学家 工程师 技术人员 xff0c 现在如
  • Opencv之Aruco码的检测和姿态估计

    1 介绍 Aruco码是由宽黑色边框和确定其标识符 id 的内部二进制矩阵组成的正方形标记 它的黑色边框有助于其在图像中的快速检测 xff0c 内部二进制编码用于识别标记和提供错误检测和纠正 单个aruco 标记就可以提供足够的对应关系 x
  • linux与window文件通过串口传输方法(zmod传输方法)

    我们在调试linux产品时 xff0c 有的产品没有网口 xff0c 只有串口 这时nfs tfp都用不了 只能用串口来传输文件 把windows上文件通过串口传输到开发板上 开发板和电脑通过串口连接 2 使用MobaXterm工具 xff
  • CentOS 7 需要安装的常用工具,及centos安装fcitx 搜狗输入法的坑旅

    Centos常用设置 1 当最大化时隐藏标题栏 或者使用tweak tool 在字体中将标题栏字体设置为0 建议这个方法 2 添加epel源 yum y nogpgcheck install http download fedoraproj
  • 小学数学公式大全

    小学数学公式大全 第一部分 xff1a 概念 1 加法交换律 xff1a 两数相加交换加数的位置 xff0c 和不变 2 加法结合律 xff1a 三个数相加 xff0c 先把前两个数相加 xff0c 或先把后两个数相加 xff0c 再同第三
  • c++中的点号(.),冒号(:)和双冒号(::)运算符

    1 冒号 xff08 xff09 用法 xff08 1 xff09 表示机构内位域的定义 xff08 即该变量占几个bit空间 xff09 typedef struct XXX unsigned char a 4 char型的字符a占4位
  • C++ 对象和实例的区别,以及用new和不用new创建类对象区别

    起初刚学C 43 43 时 xff0c 很不习惯用new xff0c 后来看老外的程序 xff0c 发现几乎都是使用new xff0c 想一想区别也不是太大 xff0c 但是在大一点的项目设计中 xff0c 有时候不使用new的确会带来很多
  • 巫泽俊...《挑战程序设计竞赛》算法及相关书籍论点

    为什么要参加程序设计竞赛 能提高程序设计能力 xff0c 掌握技巧 减少错误 xff1b 能结识更多的同好 xff0c 交流切磋 xff1b 能更好地推销自己 xff08 大赛的前几名往往受到世界知名公司的青睐 xff09 秋叶拓哉认为 x
  • (struct)结构体变量作为函数参数调用的方法小结

    结构体变量 结构指针变量 结构数组作为函数的参数应用实例分析 struct stud long int num float score 结构体变量作为函数的参数 xff0c 修改之后的成员值不能返回到主调函数 void funvr stru