当前位置 博文首页 > 谁吃薄荷糖:【??C语言函数传参の结构体数组篇??】

    谁吃薄荷糖:【??C语言函数传参の结构体数组篇??】

    作者:[db:作者] 时间:2021-09-11 13:29

    背景介绍

    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

    cs