将指针的2D数组传递给函数C.

我有一个2D数组指针

main.c Int32 * pRxSeqAddr[2][2]; func(pRxSeqAddr); 

/

 func.c void func( Int32** pRxSeqAddrPtr) { /// } 

我收到此错误:

 argument of type "Int32 *(*)[2]" is incompatible with parameter of type "Int32 ** 

我知道如果它是指针的1D数组那么这个函数调用很好,但是2D唠叨我…

请帮忙

将func.c更改为:

 void func(Int32 *pRxSeqAddrPtr[][2]) { } 

通常,要将2D数组传递给函数,您需要为除第一个维度以外的所有维度指定数组维度,因此在此示例中,您需要[2]作为最后一个维度,但您可以选择省略第一个维度,即

 void func(Int32 *pRxSeqAddrPtr[2][2]) { } 

也有效,但有些多余。

除非它是sizeof或一元&运算符的操作数,或者是用于初始化另一个数组的字符串文字,否则将类型为“N元素数组T”的表达式隐式转换(“衰减”)为类型“指针”到T“,它的值将是数组第一个元素的地址。

当您调用func(pRxSeqAddress) ,表达式pRxSeqAddress的类型将从“指向Int32的2元素数组的2元素数组”转换为“指向Int32指针的2元素数组的指针”,或者Int32 *(*)[2] 。 因此, func的原型应该是

 void func(Int32 *(*pRxSeqAddressPtr)[2]) { ... } 

在函数参数声明的上下文中, T a[]T a[N]都与T *a同义; a实际上是指针类型,而不是数组类型。 所以上面的内容可以改写成

 void func(Int32 *pRxSeqAddressPtr[][2]) { ... } 

看起来比指向数组语法的指针更清晰; 但是,我更喜欢前者,因为它描述了究竟发生了什么。 请注意,这在函数参数声明的上下文中才有效。

所以,鉴于声明T a[N][M]; ,以下都适用

表达类型衰变为
 ---------- ---- ---------
          a T [N] [M] T(*)[M]
         &a T(*)[N] [M] n / a
         * a T [M] T *
       a [i] T [M] T *
      &a [i] T(*)[M] n / a
      * a [i] T n / a
    a [i] [j] T n / a

请注意,它是指向更改的数组表达式的类型,而不是数组本身; pRxSeqAddr定义的对象 pRxSeqAddr始终是数组类型的永远。

这肯定会奏效:

 Int32* pRxSeqAddr[2*2]; func(pRxSeqAddr); void func(Int32** pRxSeqAddrPtr){}; 

或者,在您的原始示例中,您可以使用调用该函数

 funct( &pRxSeqAddr[0][0] ); 

在C中,默认情况下, 2D array'' are指向1D数组的指针数组”。

所以,在那里,你必须命名你的类型:Int32 ***

第一个数组维度的第一颗星。 (数组是指向第一个项目的指针)第二个数组维度的第二个星形。 (指向第一行的指针)第三颗星因为物品是指针。