1、退化的意义
在【C语言复习(十三)】数组和指针的第6小点中有说到,数组在作为函数参数时会退化为一个指向数组元素的指针,那么为什么C语言中的数组参数会退化为指针??
原因可能如下:
C语言中只会以值拷贝的方式传递参数;
不管是传值操作还是传址操作,其实本质上传递的还是值,这个概念在学过C++的朋友应该能明白,C++中就还有一个引用传递,传递的是地址(实参为变量名,形参为变量的引用,接收的是实参的地址);
当向一个函数传递数组时,根据虚实结合,理论上可以把整个数组拷贝一份给形参,然后再数组中使用,但是这样效率极低,肯定不符合C语言高效的特点;另外的一种方法就是将数组名看作常量指针,传递数组首元素地址给形参,这样实参和形参公用一段内存,效率提高不少!因此这也就是数组参数退化为元素指针的原因了!
2、二维数组参数
上面说到了一维数组参数的退化问题,这个在二维数组中同样存在,因为C语言中二维数组由一维数组嵌套组成;二维数组中的每个元素都是一个一维数组;
二维数组参数中的第一维的参数可以省略,需以另外的参数给出!(即是二维数组的列数)
退化示例:
void func(int a[5]);==> void func(int a[]) ==> void func(int* a);
void func(int a[3][3]);==>void func(int a[][3]);==>void func(int (*a)[3]);
3、退化后的等价关系
4、注意事项
C语言中无法向一个函数传递任意维数的多维数组,因为参数退化后,他们的指针类型不一样!
为了保证正确的指针运算,必须提供除第一维之外的所有维长度;第一维长度要以另外的参数给出,其他维的长度可以计算出来!
一维数组参数 -- 必须另外提供一个标示数组长度的参数,因为参数退化后这个长度信息将不存在!
二维数组-- 不能直接传递给函数,会先经过退化为指针;
三维或更多维数组参数 --- 无法使用!
5、传递与使用二维数组
#include <stdio.h>
#define DIM(p,type) (sizeof(*p)/sizeof(type))
void matrix(int (*ma)[3],int row)
{
//计算列数
int col=DIM(ma,int);
//遍历数组
int i=0,j=0;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
printf("%d\t",*(*(ma+i)+j));
}
}
}
int main()
{
int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
matrix(a, 3);
return 0;
}