结构体不仅可以作为函数的参数传递,也可以作为函数的返回值。现在就分别来看一下这两种情况。

结构体作为参数

struct score
{int chinese;int math;int english;
};int sum(struct score p)
{return (p.chinese + p.math + p.english);
}int main()
{int total = 0;struct score s={80,90,85};total = sum(s);printf("total is: %d \r\n",total);system("pause");return 0;
}

  定义一个结构体用于存储分数,然后使用sum()函数计算总分。将结构体作为参数传递给函数。这里的结构名不代表它的地址,而是结构体的值。上面的值传递方法相当下面这种操作:

struct names name1 = {“张”,“三”};
struct names name2 = name1;

  相当于将结构体name2直接初始化为结构体name1,它会将name1的每个成员值都赋给name2对应的成员。

  所以在上面的代码中将结构体作为参数传递,相当于在函数中又定义了一个结构体,传递的其实是结构体的备份。代码输出结果如下:

  在传递结构体本身的时候,属于值传递。所在在函数体内修改结构体的值时,不会改变函数体外结构体的值。比如修改代码如下:

struct score
{int chinese;int math;int english;
};int sum(struct score p)
{p.chinese = 100;return (p.chinese + p.math + p.english);
}int main()
{int total = 0;struct score s={80,90,85};total = sum(s);printf("total is: %d \r\n",total);printf("chinese is: %d \r\n",s.chinese);system("pause");return 0;
}

  在sum()函数中修改了语文成绩,在mani()函数中打印完总分之后,继续打印一次语文成绩。


  通过输出结果可以看出,虽然总分成绩发生了改变,但是语文成绩其实没变。如果不想在函数中是成员的值被改变,那么在函数的参数中加上const 限定符。

int sum(const struct score p)
{return (p.chinese + p.math + p.english);
}

  此时在sum()函数中就不能修改成员的值。

结构体作为返回值

  函数的参数不仅可以是结构体,同样函数的返回值依然也可以是结构体。

struct score{int chinese;int math;int english;};
struct score get(void)
{struct score s;s.chinese = 80;s.math = 85;s.english = 70;return s;
}
int main()
{int total = 0;    struct score s1;    s1 = get();total = s1.chinese + s1.math + s1.english;printf("total is: %d \r\n",total);   printf("chinese: %d math: %d english: %d \r\n",s1.chinese,s1.math,s1.english);    system("pause");return 0;
}

  在get()函数中定义了一个结构体变量并给各个成员赋值,该函数的返回值是一个结构体。在主函数中也定义一个结构体,然后用它去接收函数返回的结构体。程序执行结果如下:

  通过输出的结果可以看到,主函数中结构体变量s1中各个成员的值和函数get()中设置的值一样。相当于在主函数中复制了一个结构体,在主函数中操作的结构体是函数中结构体的副本。此时如果在主函数中改变结构体成员的值,那么get()函数中的结构体是不受影响的。

  修改代码如下:

struct score{int chinese;int math;int english;};struct score get(void)
{struct score s;s.chinese = 80;s.math = 85;s.english = 70;printf(" %d  %d  %d \r\n",s.chinese,s.math,s.english);return s;
}int main()
{int total = 0;struct score s1;    s1 = get();total = s1.chinese + s1.math + s1.english;printf("total is: %d \r\n",total);printf("chinese: %d math: %d english: %d \r\n",s1.chinese,s1.math,s1.english);    s1.chinese = 100;get();   system("pause");return 0;
}

  第一次调用get()函数之后,将返回结构体的值打印出来,然后改变s1中chinese的值,接着再调用一次get()函数。

  通过输出结果可以看到,修改主函数中结构体成员的值并不影响get()函数中结构体成员的值。通过这种返回结构体的方法,传递的是原始数据的副本,可以有效的保护原始数据的安全性。

C语言学习笔记---结构体作为函数参数和返回值相关推荐

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

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

  2. C语言学习笔记---结构体的定义和初始化

      在C语言中结构体通常用来将不同类型的变量打包在一起,方便对对象的统一管理. 结构体定义   要使用结构体时,首先要进行结构体的声明.声明的形式如下: struct 结构体名{ 结构体所包含的变量} ...

  3. Go语言学习笔记——结构体中使用tag标记

    文章目录 golang结构体中使用tag标记 简介 语法结构 快速入门 常见应用 应用json编码 应用xml编码 应用form表单绑定 gin框架form和数据绑定 golang结构体中使用tag标 ...

  4. C语言学习笔记---结构体中的字符数组和字符指针

      在结构体中可以使用字符数组来存储字符串,也可以使用字符指针来存储字符串.比如: struct str{char s1[5];char s2[5];};struct str str1= {" ...

  5. C语言学习笔记---结构体指针

      既然结构体是一种数据类型,那么除了使用变量本身来访问结构体之外,也可以使用指针来访问结构体.下面通过一个简单的例子来演示一下: struct Date{int year;int month;int ...

  6. C语言学习笔记---结构体数组初始化

      既然结构体是一种数据类型,那么它也可以定义为数组的形式.比如要描述一本书的信息,可以将书的名称,作者,价格这些信息用一个结构体来描述,在使用的过程中不可能只描述一本书,所以就需要使用一个结构体数组 ...

  7. Go语言学习、结构体

    最近疫情比较严重,过年也不能出门,闲来无事,继续更新博客吧. 武汉加油! 我们来继续说下go语言中的结构体 比如我们现在想存储一个学生信息,如:学号.姓名.年龄.性别,等信息,按照我们以前的存储习惯, ...

  8. Golang——结构体创建与初始化、结构体与数组、结构体与切片、结构体与map、结构体作为函数参数、结构体方法、结构体方法继承

    结构体: 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 结构体可以很好的管理一批有联系的数据,使用结构体可以提高程序的易读性,类似于Java的类一样 不能在结构体直接赋值 字段名必须唯一 ...

  9. C语言学习笔记(8)函数

    C语言学习笔记(8)函数 函数 函数主要是用于将解决复杂的编程问题分解为数个可以分开进行解决的小问题,通过函数分装,最后在拼连在一起.有利于多人协作开发. 函数同样需要先声明后调用,声明符号为 voi ...

最新文章

  1. 【转载】视频CDN技术原理与流程说明
  2. Server.MapPath(path)的使用
  3. python太阳花绘制
  4. opengl加载显示3D模型MDC类型文件
  5. 案例讲清如何构建“What-if分析”,教你轻松玩转动态参数
  6. iis web.config 配置 经典模式_django部署在iis下,webconfig错误
  7. 数据结构 | 链表:1097 删除重复元素
  8. linux下的node.js下载和安装
  9. python测验9答案_【Python基础测试】你知道这些答案吗?
  10. HTML、CSS:基础知识
  11. Mac 上的 MySQL 管理工具 -- Sequel Pro
  12. 指导老师对计算机论文的评语,指导老师对论文的评语
  13. c语言 面试前必备基础知识
  14. (SELECT SUBSTRING(AreaCode FROM 0 FOR 5)FROM sysarea) = '810103'
  15. 洛谷刷题笔记 地球人口承载力估计
  16. Python基础教程(第三版)
  17. 带宽和网速之间的关系
  18. html中波浪线线怎么设置,如何在PPT中加波浪线?
  19. java opencv 更换图片背景色(基于ROI)
  20. python网络游戏开发教程_python 网游开发教程 | python做的游戏有哪些

热门文章

  1. Poj 1503 Integer Inquiry
  2. 游戏理论研究四:RPG游戏
  3. mysql,索引命中,查询级别
  4. 找出N个无序数中第K大的数
  5. poj3461kmp
  6. html 13 背景
  7. Ubuntu 8.04 告白登岸德国柏林的地铁零碎
  8. 【Java】面向对象是什么
  9. 小微型计算机2018北大核心,2018年全国北大中文核心期刊目录
  10. C语言分支结构while,C语言学习:分支结构和循环结构的总结(收藏)