【问题标题】:Why isn't it possible to pass a two-dimensional array as function argument?为什么不能将二维数组作为函数参数传递?
【发布时间】:2017-08-31 22:32:38
【问题描述】:

我正在搜索 C 中的指针,我找到了this question。基本上,用户想知道如何在 C 中将矩阵作为函数的参数传递。投票最多的答案说他不能使用指向指针 (type ** identifier) 的指针,因为:

(...) 任何静态二维数组都要求第二级指针是指向静态数组的 const 指针

他说“指向静态数组的常量指针”是什么意思?以及这是如何编码的?我知道 const 变量(包含的指针)的含义,所以也知道静态变量。但是,在这种情况下,为什么它必须是指向静态数组的常量指针

【问题讨论】:

  • 您引用的文字毫无意义。看起来写它的人也删除了他的帐户
  • 基本上声明int array[x][y];(其中xy 是常量),您正在声明一个类型int [x][y]。当作为参数传递给函数时,第一级间接转换为指针。这意味着它将作为int (*)[y] 传递,这与int **不同int ** 是一个 pointer-to-pointer-to-intint (*)[y] 是一个 pointer-to-array-of-int [y](每个都大)。
  • “静态”在这种情况下可能意味着“与动态相反”。指针到指针的语法不是二维数组,而且大多数时候它也是不好的做法。见Correctly allocating multi-dimensional arrays

标签: c arrays pointers matrix


【解决方案1】:

他说“指向静态数组的常量指针”是什么意思?

我认为他的意思是说需要将数组视为连续的;它必须是一个接一个的元素序列,没有指针的空间。他可能试图声称取消引用一个二维数组一次(例如*matmat[0])应该导致一个指向子数组常量 (这在某些情况下也是不正确的,当用作sizeof 的操作数时,我将很快介绍其中一种情况。

FWIW,这也是不正确的:

如果矩阵是动态数组,则前面的标题是正确的。

int mat[SIZE][SIZE]; 如果我们检查这个对象,sizeof mat 等于 sizeof (int) * SIZE * SIZE;此矩阵中没有任何指针存储空间。然而,在void ins (int **matrix, int row, int column); 中,int **matrix 告诉我们matrix 指向int *,这意味着 指针空间,也意味着matrix 可能没有是连续的。

...这是如何编码的?

对于那个问题,错误的是,int ** 指向 int * 对象,而不是 int[SIZE] 对象。

...为什么它必须是指向静态数组的常量指针

请参阅此答案的第一段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2011-10-27
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多