背景介绍

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​