【 C 】作为函数参数的多维数组
我们都知道一维数组作为函数参数的情况,作为函数参数的一维数组名——实际传递的是指向数组第一个元素的指针。
多维数组名作为函数参数的传递方式和一维数组名相同——实际传递的也是指向第一个元素的指针。
但是,两者之间不同的是,多维数组的每个元素本身就是另外一个数组,(例如二位数组a[m][n]的第一个元素a[0]本身就是一个包含n个元素的一维数组),这样的话,编译器需要知道它的维数,以便为函数形参的下标表达式进行求值。
下面举两个例子,说明它们之间的区别:
1)
int vector[10];
...
func1(vector); //函数调用
参数vector的类型是指向整型的指针,所以func1的原型可以是下面两种中的任何一种:
void func1( int *vec );
void func1( int vec[] );
2)
下面涉及指向数组的指针,如果不懂指向数组的指针可以参看我的博文:指向数组的指针
现在我们来观察另一个矩阵(数组):
int matrix[3][10];
...
func2( matrix );
这里,参数matrix的类型是指向包含10个整型元素的数组的指针。所以func2的原型应该是下面这个样子的:
void func2( int (*p)[10] );
void func2( int p[][10] );
即,形参也应该是指向整型数组的指针,也可以写成二维数组的形式,因为(*p)[10 ] 相当于 p[][ 10 ];
在这个函数中,mat的第一个下标根据包含10个元素的整型数组的长度进行调整,接着第2个下标根据整型的长度进行调整,这和原先的matrix数组一样。
这里的关键在于编译器必须知道第2个及以后各维的长度才能对各下标进行求值,因此在原型中必须声明这些维的长度。第1维的长度并不重要,因为在计算下标值时用不到它。
在编写一维数组形参的函数原型时,你既可以把它写成数组的形式,也可以把它写成指针的形式。但是对于多维数组,只有第1维可以进行如此选择。尤其是,把func2写成下面这样的函数原型是不正确的:
void func2( int ** mat );
这个例子把mat声明为一个指向整型指针的指针,和指向整型数组的指针并不是一回事。
文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。
原文链接:reborn.blog.csdn.net/article/details/82503162
- 点赞
- 收藏
- 关注作者
评论(0)