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

Posted 谁吃薄荷糖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了☀️C语言函数传参の结构体数组篇☀️相关的知识,希望对你有一定的参考价值。

背景介绍

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

以上是关于☀️C语言函数传参の结构体数组篇☀️的主要内容,如果未能解决你的问题,请参考以下文章

C语言初阶❤️ 海纳百家 探究新的数据类型——结构体(一定要收藏哦!)❤️

C语言☀️自定义类型(结构体+位段+枚举+联合体)建议收藏

Golang✔️走进 Go 语言✔️ 第十二课 结构体 & 切片

Golang✔️走进 Go 语言✔️ 第十二课 结构体 & 切片

❗划重点!C语言函数参数传递只有两种方式(值传递,地址传递),不支持“引用传递”!❗

❗划重点!C语言函数参数传递只有两种方式(值传递,地址传递),不支持“引用传递”!❗