我目前正在学习在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]);
我的理解是ar
和first
函数中的third
参数是等效的。 short ar[][30]
函数中的first
等同于short (*ar)[30]
函数中的third
,因为它们都是指向array of 30 short
的指针。
ar
函数中的second
不同,因为在short ar[30]
中,ar
是pointer to short
,而不是指向array of 30 short
的指针。< / p>
我的理解是否正确?
答案 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
是错误的。(int
和short
可能具有相同的大小,但保证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 *
。