【C】作为函数参数的多维数组

版权声明:本博客内容来自于个人学习过程中的总结,参考了互联网以及书本、论文等上的内容,仅供学习交流使用,如有侵权,请联系我会重写!转载请注明地址! https://blog.csdn.net/Reborn_Lee/article/details/82503162

我们都知道一维数组作为函数参数的情况,作为函数参数的一维数组名——实际传递的是指向数组第一个元素的指针。

多维数组名作为函数参数的传递方式和一维数组名相同——实际传递的也是指向第一个元素的指针。

但是,两者之间不同的是,多维数组的每个元素本身就是另外一个数组,(例如二位数组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声明为一个指向整型指针的指针,和指向整型数组的指针并不是一回事。

猜你喜欢

转载自blog.csdn.net/Reborn_Lee/article/details/82503162