背景介绍

C语言中函数参数传递的两种方式(“引用传递做函数参数”是C++的特性,C语言不支持。
(1)传值,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值。
(2)传址,就是传变量的地址赋给函数里形式参数的指针,使指针指向真实的变量的地址,因为对指针所指地址的内容的改变能反映到函数外,也就是能改变函数外的变量的值。一般有变量地址作为参数、数组名作为参数、指针作为参数。

  1. 数组名作为参数时,传递的是数组的首地址,实参数组和形参数组共用了一段内存空间。所以当用数组名做参数时,实参和形参共享了一个数组,形参数组的改变也就是实参数组的改变。
  2. 指针作为参数和数组名作参数类似,传递的也是结构体数组的首地址,但是此时不是共享一个数组,而是共享一个变量的地址,也就是实参指针和形参指针共同指向同一个变量,共享同一个变量地址。

示例demo

下面的demo中:
test函数以结构体数组名为形参;
test1函数以结构体数组的首地址和数组大小作为形参;
test2函数是把结构体数组的首地址传入,然后以数组的形式遍历;

#include <stdio.h>
#include <string.h>#define MAXNUM (2)typedef struct tagNumber
{int i;int j;int k;
}TNum;typedef struct tagNumbers
{TNum atNum[MAXNUM];
}TNums;// 结构体数组名
void test (TNums atNums1[])
{printf("atNums1 ptr:%p\r\n",atNums1);int idx = 0; int idx1 = 0;for(idx = 0; idx < MAXNUM; idx++){for(idx1 = 0; idx1 < MAXNUM; idx1++){printf("i:%d\n",atNums1[idx].atNum[idx1].i);printf("j:%d\n",atNums1[idx].atNum[idx1].j);printf("k:%d\n",atNums1[idx].atNum[idx1].k);}}
}//结构体指针1.0
void test1(TNums *ptNum,int num)
{printf("ptNum ptr:%p\r\n",ptNum);int idx = 0; int idx1 = 0;for(idx = 0; idx < num; idx++){for(idx1 = 0; idx1 < num; idx1++){printf("i:%d\n",(ptNum + idx)->atNum[idx1].i);printf("j:%d\n",(ptNum + idx)->atNum[idx1].j);printf("k:%d\n",(ptNum + idx)->atNum[idx1].k);}}
}//结构体指针1.1
void test2(TNums *ptNum)
{printf("ptNum ptr:%p\r\n",ptNum);int idx = 0; int idx1 = 0;for(idx = 0; idx < MAXNUM; idx++){for(idx1 = 0; idx1 < MAXNUM; idx1++){printf("i:%d\n",ptNum[idx].atNum[idx1].i);printf("j:%d\n",ptNum[idx].atNum[idx1].j);printf("k:%d\n",ptNum[idx].atNum[idx1].k);}}
}int main() {TNums atNums[MAXNUM];memset(atNums, 0, sizeof(atNums));int idx = 0; int idx1 = 0;for(idx = 0; idx < MAXNUM; idx++){for(idx1 = 0; idx1 < MAXNUM; idx1++){atNums[idx].atNum[idx1].i = 1+idx;atNums[idx].atNum[idx1].j = 2+idx;atNums[idx].atNum[idx1].k = 3+idx;}}printf("atNums ptr:%p\r\n",atNums);printf("func 1:\r\n");test(atNums);printf("func 2:\r\n");test1(atNums, MAXNUM);printf("func 3:\r\n");test2(atNums);return 0;
}

打印信息:

atNums ptr:0x7fff87dba270
func 1:
atNums1 ptr:0x7fff87dba270
i:1
j:2
k:3
i:1
j:2
k:3
i:2
j:3
k:4
i:2
j:3
k:4
func 2:
ptNum ptr:0x7fff87dba270
i:1
j:2
k:3
i:1
j:2
k:3
i:2
j:3
k:4
i:2
j:3
k:4
func 3:
ptNum ptr:0x7fff87dba270
i:1
j:2
k:3
i:1
j:2
k:3
i:2
j:3
k:4
i:2
j:3
k:4

引经据典

http://www.oh100.com/kaoshi/c/536660.html

【☀️C语言函数传参の结构体数组篇☀️】相关推荐

  1. C语言试题五十二之学生的记录由学号和成绩组称个,n名大学生得数据已在主函数中放入结构体数组a中,请编写函数fun,它的功能时:按分数的高低排列学生的记录,高分在前。

    1. 题目 请编写一个函数void function(Student a[], int n),其功能时:学生的记录由学号和成绩组称个,n名大学生得数据已在主函数中放入结构体数组a中,请编写函数fun, ...

  2. c语言 由函数组成的数组,学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun(),它的_考题宝...

    学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun(),它的功能是按分数的高低排列学生的记录,低分在前. 注意:部分源程序给出如下. 请勿改动主函数main和其 ...

  3. C语言学生管理系统(结构体数组)

    简介 简单的学生管理系统,使用C语言编写. 功能 拥有增.删.改.查.打印.文件读写.搜索以及排序功能. 环境 推荐使用VS2015或以上版本(支持C11或以上)的编译器运行代码. 结构 数据结构为结 ...

  4. c语言函数指针、结构体、枚举实例(详细)解析(快速掌握)

    目录 一.概述 1.1 简介 1.2 简单示例 二.实例操作 2.1 定义一个函数指针 2.2 使用数组将多个函数指针存放 2.3 使用枚举确定数组成员值 2.4 定义一个结构体 三.完整程序讲解 3 ...

  5. C语言函数指针(结构体函数指针)

    文章目录 20211126 这篇讲得好 参考文章1:C语言函数指针(指向函数的指针)详解 函数指针的定义形式: returnType (*pointerName)(param list); 示例代码: ...

  6. c语言读取文件到结构体数组,有关文件读写到结构体数组问题;

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 typedef struct IMG { char *name; int weight; int height; }IMG; 这是我的结构体存的是 图片的 ...

  7. c语言函数传参时候的类型强制装换

    由于函数调用的参数是表达式,所以在参数传递给函数时候也可能进行类型转换.在没有函数原型的情况下,char与short类型都将被转换为int类型,float类型将被转换为double类型,因此,即使调用 ...

  8. C语言编程>第十二周 ③ 已知学生的记录由学号和学习成绩构成,M名学生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数。

    已知学生的记录由学号和学习成绩构成,M名学生的数据已存入a结构体数组中.请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数(规定只有一个最高分).已给出函数的首部,请完成该函 ...

  9. C语言编程>第十三周 ⑧ 已知学生的记录由学号和学习成绩组成,M名学生的数据已存入stu结构体数组中。请编写函数fun,该函数的功能是:

    例题:已知学生的记录由学号和学习成绩组成,M名学生的数据已存入stu结构体数组中.请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数(规定只有一个最高分).已给出函数的首部, ...

最新文章

  1. nodejs系列(二)REPL交互解释 事件循环
  2. Selenium3自动化测试——4. 获取百度备案信息
  3. 使用JAX-RS创建RESTful Web Service
  4. 计算机桌面是是在哪个盘,电脑虚拟内存是设置在哪个盘的
  5. 五、【SAP-PM模块】服务采购业务流程
  6. sendmail邮件服务器配置
  7. exchange邮件服务器_基于Spring Boot快速实现发送邮件功能
  8. extend_gcd求解不定方程/膜线性方程/乘法(模)逆元
  9. 递归算法造成的问题分析与解决
  10. mysql 参数 innodb_flush_log_at_trx_commit
  11. 容器时代的DevOps部署-普元DevOps
  12. 三角函数科学计算机在线应用,Scientific Calculator插件,在线科学计算器
  13. 交通仿真 | SUMO第一步
  14. 计算机网络和智能家居,智能家居与传统智能家居到底有什么区别
  15. 16.04Ubuntu桌面版搭建
  16. java socket 超时_Java Socket超时浅析
  17. 休闲食品线上与线下的差异化
  18. 命令行quser logoff
  19. 数据库SQL实战 --47.将所有获取奖金的员工当前的薪水增加10%
  20. Xamarin.Forms学习之路——MarvelCard改造版

热门文章

  1. nginx 配置404错误页面
  2. nginx+lua (一)
  3. 命令行下django-admin.py参数不起作用的问题解决
  4. struts2配置文件(简单)
  5. 通过扩展改善ASP.NET MVC的验证机制[实现篇]
  6. Activity与Thread之间的通讯(old)
  7. 浅析Python中的序列化存储的方法
  8. O(logn*2^logn)和O(n*logn)算法
  9. Pytorch实践中文教程(1)
  10. 基本电子电路系列——MOS管