资讯专栏INFORMATION COLUMN

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

20171112 / 1127人阅读

背景介绍

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

相关文章

  • 深度剖析结构@自定义类型1---结构的声明,自引用,变量定义和初始化 + 结构内存对齐 + 结

    摘要:整个结构体的大小是所有成员最大对齐数含嵌套结构体的对齐数的整数倍。例如尽管和类型的成员一模一样,但是占用空间的大小还是有一定区别。因此结构体传参时,最好还是穿结构体的地址。与结构相比,位段作用相似,结构能使用的地方,位段设计合理也能实现。 ...

    hearaway 评论0 收藏0
  • 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元查看
<