我目前正在学习使用 C 语言处理多维数组的函数。
假设我有
short myArray[10][30].
我已经声明了以下函数原型(prototype)以与 myArray
一起使用。
void first(int n, short ar[][30]);
void second(int n, short ar[30]);
void third(int n, short (*ar)[30]);
我的理解是 first
和 third
函数中的 ar
参数是等价的。 first
函数中的short ar[][30]
等同于third
中的short (*ar)[30]
code> 函数,因为它们都是指向 array of 30 short
的指针。
second
函数中的 ar
是不同的,因为在 short ar[30]
中,ar
是一个 指向 short 的指针
,而不是指向 array of 30 short
的指针。
我的理解对吗?
最佳答案
是的,你的理解是正确的。 1和3是等价的。并且 2 也是正确的(但不适用于传递二维数组 - 传递一维数组是正确的)。但是会澄清第二种情况。
第二个是编译器不考虑第三个括号内的 30 个。你可以省略它,编译器也不会提示。 实际上,您在这里传递了一个 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
的大小大于或等于 short
的大小)。如果您使用 short
,然后在声明中写入 int
,那会起作用。
编辑:第二个不用于传递二维数组。让我们弄清楚这一点。您不能将二维数组传递给原型(prototype)声明为第二个的函数。对于指针,有两件事需要考虑——类型和值。如果您试图将二维数组传递给同一个函数,那将是非法的。二维数组衰减为 int (*)[30]
,这与 int *
或 int[]
完全不同。
关于c - 用多维数组参数表示函数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48219818/