资讯专栏INFORMATION COLUMN

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

20171112 / 1256人阅读

背景介绍

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

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

示例demo

下面的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

相关文章

  • C语言初阶】❤ 教你使用C语言中的各种操作符(熟练运用+必须收藏)❤

    本章目录 温馨提示本章重点正文开始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. ...

    source 评论0 收藏0
  • C语言通讯录管理系统(简易版)❤

    ❤️C语言通讯录管理系统(简易版)❤️ ?一、通讯录?二、菜单实现和用户交互?三、主函数⭐️⭐️1.enum选项⭐️⭐️2.switch判断 ?四、定义联系人和通讯录⭐️⭐️1.定义联系人结构体⭐️⭐️2.定义通讯录结构体⭐️⭐️3.定义结构体变量 ?五、通讯录初始化?六、新增联系人?七、查找联系人?八、删除联系人?九、修改联系人?十、查看所有联系人?十一、清空所有联系人?十二、以名字排序所有...

    justCoding 评论0 收藏0
  • 整理2万字带你走进C语言(详细讲解+代码演示+图解)❤(强烈建议收藏!!!)

    目录 一、什么是C语言? 二、第一个C语言程序 代码 程序分析  程序运行 一个工程中出现两个及以上的main函数 代码 运行结果 分析 三、数据类型 数据各种类型 为什么会有这么多的数据类型? 计算机单位  各个数据类型的大小  注意事项 数据类型的使用 四、变量和常量 变量的分类 变量的使用 变量的作用域和生命周期  常量 五、字符串+转义字符+注释 字符串  转义字符 注释 六、选择语句  ...

    邱勇 评论0 收藏0
  • 怎么样才能做到对多种数据类型排序?C语言快速排序——qsort函数及其模拟实现

    摘要:我们以冒泡排序为例,模拟实现函数。交换每单位字节对于的二进制序列这样,冒泡排序就能排序多种数据类型,模拟实现了函数,当然也可以使用其他的排序方法模拟实现函数。 ⭐️...

    alphahans 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<