【问题标题】:Why does 2 dimension array passing to function requires its size?为什么二维数组传递给函数需要它的大小?
【发布时间】:2013-12-11 15:49:41
【问题描述】:

启发thisquiestion。

为什么——

void display(int p[][SIZE]) // allowed

void display(int p[][]) // not allowed

?

【问题讨论】:

  • 因为数组不是指针,数组的数组也不是指针的指针。

标签: c arrays pointers multidimensional-array


【解决方案1】:

因为数组在传递给函数时衰减指向指针。如果不提供数组第二维的基数,编译器将不知道如何取消引用该指针。

这里有一个更长的解释:当你写这个时

p[index]

编译器执行一些指针运算来找到它需要引用的元素的地址:它将index乘以p元素的大小,并将其添加到p的基地址:

address = <base address of p> + index * <size of p's element>

当您尝试传递这样的数组p[][] 时,编译器只知道p 的基地址,但不知道其元素的大小。为了让编译器知道p元素的大小,你需要提供第二维的基数。

【讨论】:

    【解决方案2】:

    因为二维数组是按行存储的,因此该函数需要列数,以便知道下一行何时开始。

    【讨论】:

      【解决方案3】:

      那是因为指针中的计算需要这样做。 当 p 指向大小为SIZE 的二维数组时,此操作p+=3 是这样计算的:

      如果 p 的值是一个常数 等于 ADRESS p 接收这个值 ADRESS + 3*SIZE。

      这是因为指针中的算术与实数中的算术不同。在不知道数组大小的情况下无法进行此计算。

      【讨论】:

        猜你喜欢
        • 2013-12-29
        • 2016-10-25
        • 2020-07-02
        • 2012-09-30
        • 1970-01-01
        • 2017-07-26
        • 2011-05-24
        • 1970-01-01
        • 2012-04-27
        相关资源
        最近更新 更多