【☀️C语言函数传参の结构体数组篇☀️】
背景介绍
C语言中函数参数传递的两种方式(“引用传递做函数参数”是C++的特性,C语言不支持。)
(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语言函数传参の结构体数组篇☀️】相关推荐
- C语言试题五十二之学生的记录由学号和成绩组称个,n名大学生得数据已在主函数中放入结构体数组a中,请编写函数fun,它的功能时:按分数的高低排列学生的记录,高分在前。
1. 题目 请编写一个函数void function(Student a[], int n),其功能时:学生的记录由学号和成绩组称个,n名大学生得数据已在主函数中放入结构体数组a中,请编写函数fun, ...
- c语言 由函数组成的数组,学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun(),它的_考题宝...
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun(),它的功能是按分数的高低排列学生的记录,低分在前. 注意:部分源程序给出如下. 请勿改动主函数main和其 ...
- C语言学生管理系统(结构体数组)
简介 简单的学生管理系统,使用C语言编写. 功能 拥有增.删.改.查.打印.文件读写.搜索以及排序功能. 环境 推荐使用VS2015或以上版本(支持C11或以上)的编译器运行代码. 结构 数据结构为结 ...
- c语言函数指针、结构体、枚举实例(详细)解析(快速掌握)
目录 一.概述 1.1 简介 1.2 简单示例 二.实例操作 2.1 定义一个函数指针 2.2 使用数组将多个函数指针存放 2.3 使用枚举确定数组成员值 2.4 定义一个结构体 三.完整程序讲解 3 ...
- C语言函数指针(结构体函数指针)
文章目录 20211126 这篇讲得好 参考文章1:C语言函数指针(指向函数的指针)详解 函数指针的定义形式: returnType (*pointerName)(param list); 示例代码: ...
- c语言读取文件到结构体数组,有关文件读写到结构体数组问题;
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 typedef struct IMG { char *name; int weight; int height; }IMG; 这是我的结构体存的是 图片的 ...
- c语言函数传参时候的类型强制装换
由于函数调用的参数是表达式,所以在参数传递给函数时候也可能进行类型转换.在没有函数原型的情况下,char与short类型都将被转换为int类型,float类型将被转换为double类型,因此,即使调用 ...
- C语言编程>第十二周 ③ 已知学生的记录由学号和学习成绩构成,M名学生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数。
已知学生的记录由学号和学习成绩构成,M名学生的数据已存入a结构体数组中.请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数(规定只有一个最高分).已给出函数的首部,请完成该函 ...
- C语言编程>第十三周 ⑧ 已知学生的记录由学号和学习成绩组成,M名学生的数据已存入stu结构体数组中。请编写函数fun,该函数的功能是:
例题:已知学生的记录由学号和学习成绩组成,M名学生的数据已存入stu结构体数组中.请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数(规定只有一个最高分).已给出函数的首部, ...
最新文章
- nodejs系列(二)REPL交互解释 事件循环
- Selenium3自动化测试——4. 获取百度备案信息
- 使用JAX-RS创建RESTful Web Service
- 计算机桌面是是在哪个盘,电脑虚拟内存是设置在哪个盘的
- 五、【SAP-PM模块】服务采购业务流程
- sendmail邮件服务器配置
- exchange邮件服务器_基于Spring Boot快速实现发送邮件功能
- extend_gcd求解不定方程/膜线性方程/乘法(模)逆元
- 递归算法造成的问题分析与解决
- mysql 参数 innodb_flush_log_at_trx_commit
- 容器时代的DevOps部署-普元DevOps
- 三角函数科学计算机在线应用,Scientific Calculator插件,在线科学计算器
- 交通仿真 | SUMO第一步
- 计算机网络和智能家居,智能家居与传统智能家居到底有什么区别
- 16.04Ubuntu桌面版搭建
- java socket 超时_Java Socket超时浅析
- 休闲食品线上与线下的差异化
- 命令行quser logoff
- 数据库SQL实战 --47.将所有获取奖金的员工当前的薪水增加10%
- Xamarin.Forms学习之路——MarvelCard改造版