用多维数组参数表示函数的方法

时间:2018-01-12 05:01:24

标签: c arrays multidimensional-array parameters arguments

我目前正在学习在C中使用多维数组的函数。

假设我有

short myArray[10][30].

我已声明以下函数原型与myArray一起使用。

void first(int n, short ar[][30]);
void second(int n, short ar[30]);
void third(int n, short (*ar)[30]);

我的理解是arfirst函数中的third参数是等效的。 short ar[][30]函数中的first等同于short (*ar)[30]函数中的third,因为它们都是指向array of 30 short的指针。

ar函数中的second不同,因为在short ar[30]中,arpointer to short,而不是指向array of 30 short的指针。< / p>

我的理解是否正确?

2 个答案:

答案 0 :(得分:2)

是的,你的理解是正确的。 1和3是等价的。 2也是正确的(但不是传递2d数组 - 传递1D数组是正确的)。但是会在第二种情况下澄清一下。

编译器不考虑第三个括号内的第二个。您可以省略它仍然编译器不会抱怨。 实际上你已经通过了一个short 的一维数组,它被衰减成指向第一个元素的指针(第一个元素是short它是short*)。所以第二个你也可以写成short *ar

void second(int n, short ar[]);
void second(int n, short* ar );

这两个作品在这方面是相同的。 第二个用于传递一维数组,如

   second(n, myArray[5]);

问题是,大多数时间数组衰减为指针(例外是sizeof运算符或Alignof等)。将数组传递给函数是数组衰减的情况。

此外,您正在传递int数组,因此编写short是错误的。(intshort可能具有相同的大小,但保证int的大小1}}将大于或等于short的大小。如果你使用了short,然后在声明中写了int

编辑:第二个不是用于传递2d数组。让我们清楚一点。您不能将2d数组传递给函数,并将原型声明为第二个。对于指针,有两件事需要考虑 - 它的类型和价值。如果您尝试将2d数组传递给同一个非法的函数。 2d数组衰减为int (*)[30],与int *int[]无关。

答案 1 :(得分:1)

1和3确实是相同的,就像

一样
void fourth(int n, short ar[10][30]);

因为当您将数组作为函数参数传递时,它衰减指向其第一个参数的指针,因此编译器将1和4视为3。

这解释了为什么这也是正确的:

void fifth(int n, short arr[15][30]);

当它衰减到指针时,不使用第一个维度的声明大小。你应该以另一种方式给出实际尺寸。

但这个是不同的:

void second(int n, short ar[30]);

并且您的编译器应该在那里发出警告,因为当您将指针传递给30 short的数组时,预期的参数是指向short的指针。当然,指针将具有相同的(相同的地址),并且常见的编译器将给出预期的结果,但标准不允许别名指向数组的指针和指向元素的指针。所以请避免它。

通过这样的声明,second应该被称为

cr = second(n, arr[0]);

因为arr[0] 是一个短数组,并且会正确地衰减为short *