C语言中函数参数传递的两种方式(“引用传递做函数参数”是C++的特性,C语言不支持。)
(1)传值,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值。
(2)传址,就是传变量的地址赋给函数里形式参数的指针,使指针指向真实的变量的地址,因为对指针所指地址的内容的改变能反映到函数外,也就是能改变函数外的变量的值。一般有变量地址作为参数、数组名作为参数、指针作为参数。
下面的demo中:
test函数以结构体数组名为形参;
test1函数以结构体数组的首地址和数组大小作为形参;
test2函数是把结构体数组的首地址传入,然后以数组的形式遍历;
#include #include #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.0void 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.1void 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:0x7fff87dba270func 1:atNums1 ptr:0x7fff87dba270i:1j:2k:3i:1j:2k:3i:2j:3k:4i:2j:3k:4func 2:ptNum ptr:0x7fff87dba270i:1j:2k:3i:1j:2k:3i:2j:3k:4i:2j:3k:4func 3:ptNum ptr:0x7fff87dba270i:1j:2k:3i:1j:2k:3i:2j:3k:4i:2j:3k:4
http://www.oh100.com/kaoshi/c/536660.html
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/118810.html
本章目录 温馨提示本章重点正文开始1. 操作符分类2.算数操作符2.1 `/`操作符2.2 `%`操作符 3. 位移操作符3.1 ``左移操作符 4. 位操作符4.1 `&`按位与操作符4.2 `|`按位或操作符4.3 `^`按位异或操作符 5. 赋值操作符6. 单目操作符6.1 各种单目操作符6.2 sizeof 和 数组 7. 关系操作符(后面的操作符不单独出现在目录中)8. ...
❤️C语言通讯录管理系统(简易版)❤️ ?一、通讯录?二、菜单实现和用户交互?三、主函数⭐️⭐️1.enum选项⭐️⭐️2.switch判断 ?四、定义联系人和通讯录⭐️⭐️1.定义联系人结构体⭐️⭐️2.定义通讯录结构体⭐️⭐️3.定义结构体变量 ?五、通讯录初始化?六、新增联系人?七、查找联系人?八、删除联系人?九、修改联系人?十、查看所有联系人?十一、清空所有联系人?十二、以名字排序所有...
目录 一、什么是C语言? 二、第一个C语言程序 代码 程序分析 程序运行 一个工程中出现两个及以上的main函数 代码 运行结果 分析 三、数据类型 数据各种类型 为什么会有这么多的数据类型? 计算机单位 各个数据类型的大小 注意事项 数据类型的使用 四、变量和常量 变量的分类 变量的使用 变量的作用域和生命周期 常量 五、字符串+转义字符+注释 字符串 转义字符 注释 六、选择语句 ...
摘要:我们以冒泡排序为例,模拟实现函数。交换每单位字节对于的二进制序列这样,冒泡排序就能排序多种数据类型,模拟实现了函数,当然也可以使用其他的排序方法模拟实现函数。 ⭐️...
阅读 4635·2021-11-18 13:23
阅读 874·2021-09-22 15:24
阅读 1901·2021-09-06 15:00
阅读 2596·2021-09-03 10:30
阅读 1257·2021-09-02 15:15
阅读 2031·2019-08-30 15:54
阅读 2999·2019-08-30 15:44
阅读 1427·2019-08-29 15:12