微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 跟周立功学C语言编程:如何将二维数组作为函数参数传递?这三要素要时刻谨记!

跟周立功学C语言编程:如何将二维数组作为函数参数传递?这三要素要时刻谨记!

时间:08-06 来源:ZLG致远电子 点击:

第一章为程序设计基础,本文为1.7.3将二维数组作为函数参数。

 

>>>> 1.7.3 将二维数组作为函数参数

 

>>> 1. 函数原型

 

当将数组的数组作为函数参数时,数组名同样视为地址,因此相应的形参如同一维数组一样也是一个指针,比较困难的是如何正确地声明一个指针变量pData指向一个数组的数组data? 如果将pData声明为指向int类型是不够的,因为指向int类型的指针变量只能与data[0]的类型匹配。假设有以下代码:

int data[3][2] = {{1, 2}, {3, 4}, {5, 6}};

int total = sum(data, 3);

 

那么sum()函数的原型是什么?

 

由于表达式中的数组名data可以被解释为指针,即data的类型为指向int [2]的指针类型int (*)[2],因此必须将pData声明为与之匹配的类型,data才能作为实参传递给sum()。其函数原型如下:

int sum(int (*pDdata)[2], int size);  

 

当然,也可以将这个函数原型写成下面这样的形式:

int sum(int data[3][2], int size); 

 

还有一种格式,这种格式与上述原型的含义完全相同,但可读性更强。在声明一个接收二维数组为参数的函数时,只要提供第二个即可:

int sum(int data[][2], int size);

 

其中,data[]表达式是数组指针的一种隐式声明,(*pData)表达式则是指针的一种显式声明。虽然data是"由2个int值组成的数组(元素个数未知)",但它同样可以被解释为"指向int [2]的指针"。即:

int sum(int (*pData)[2], int size); 

 

由于下标是数组类型的一部分,如果第2个方括号是空的,则数组类型就不完整了,因为编译器也不知道如何补全它。因此类似这样的声明:

int sum(int data[3][], int size); 

int sum(int data[][], int size); 

 

是错误的。

 

sun()函数为何将行数(3)作为参数,而不是将列(2)作为参数呢?上述原型都指出,data是指针不是数组。由于data是由2个int值组成的数组,因此也就意味着在声明时指定了列数,这就是为什么没有将列数作为独立的函数参数进行传递的原因。比如:

int data[80][3]; 

int total = sum(data, 20);

int total = sum(data+5, 10); 

 

当然,也可以让函数将二维数组看成一维数组,比如,如何找到二维数组中的最大元素。其函数原型(iMax.h文件)如下:

int iMax(int *pData, size_t numData) 

 

如果将数组的地址data作为iMax()函数的第1个实参,数组data中的元素总数量row*col作为第2个实参:

largest = iMax(data, row*col);

 

则无法通过编译,因为data的类型为int (*)[col],而iMax函数期望的实参类型是int *。正确的调用形式如下:

largest = iMax(data[0], row*col); 

 

其中的data[0]指向第0行的元素0,经过编译器转换后,其类型为int *,实参与形参类型一致。当将data强制转换为(int *)data时,同样也可以求二维数组中元素的最大值,详见程序清单 1.33。

 

程序清单 1.33 求二维数组中元素的最大值范例程序

1     #include

2     #include "iMax.h"

3

4     int main(int argc, char *argv[]) 

5     { 

6            int data[][2] = {{1, 2}, {3, 4}, {5, 6}};

7            int n = sizeof(data) / sizeof(data[0][0]); 

8            printf("%d\n", iMax((int *)data, n)); 

9            return 0; 

10   }

 

由于data[0][0]是一个int值,因此&data[0][0]的类型为int *const。即可用以下方式指向data的第1个元素,增加指针的值使它指向下一个元素。即:

int *ptr = &data[0][0]; 

int *ptr = data[0];

 

如果将某人一

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top