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

标签 c arrays multidimensional-array parameters arguments

我目前正在学习使用 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]);

我的理解是 firstthird 函数中的 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 是错误的。(intshort 可能具有相同的大小,但保证 int 的大小大于或等于 short 的大小)。如果您使用 short,然后在声明中写入 int,那会起作用。

编辑:第二个不用于传递二维数组。让我们弄清楚这一点。您不能将二维数组传递给原型(prototype)声明为第二个的函数。对于指针,有两件事需要考虑——类型和值。如果您试图将二维数组传递给同一个函数,那将是非法的。二维数组衰减为 int (*)[30],这与 int *int[] 完全不同。

关于c - 用多维数组参数表示函数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48219818/

相关文章:

c++ - char * arr[5] = {...} 上的访问冲突,这是什么?

python - 将 numpy 数组对象与多个条件进行比较

Javascript Concat 多维数组

c - 使用带有指向双指针的指针的 scanf()

c - 如何从main中的函数读取二维数组

c - 将位数减少 1

你能解释一下下面的输出吗?

c - 如何在 C 中使用指针获取多维数组的输入并打印数组?

c++ - 显示数组元素时出错

c - 从 c 数组索引问题中的串行端口读取该数据