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

举报
李锐博恩 发表于 2021/07/15 05:54:14 2021/07/15
【摘要】 我们都知道一维数组作为函数参数的情况,作为函数参数的一维数组名——实际传递的是指向数组第一个元素的指针。 多维数组名作为函数参数的传递方式和一维数组名相同——实际传递的也是指向第一个元素的指针。 但是,两者之间不同的是,多维数组的每个元素本身就是另外一个数组,(例如二位数组a[m][n]的第一个元素a[0]本身就是一个包含n个元素的一维数组),这样的话,编译器需要知道它的...

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

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

但是,两者之间不同的是,多维数组的每个元素本身就是另外一个数组,(例如二位数组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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。