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

时间:2010-11-11 09:14:47

标签: c arrays function pointers 2d

我有一个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唠叨我...

请帮助

4 个答案:

答案 0 :(得分:5)

将func.c更改为:

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

}

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

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

}

也有效,但有些多余。

答案 1 :(得分:4)

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

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

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

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

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

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

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

Expression        Type         Decays to
----------        ----         ---------
         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中定义的对象 main始终是数组类型的永远。

答案 2 :(得分:-2)

这肯定有用:

Int32* pRxSeqAddr[2*2];
func(pRxSeqAddr);

void func(Int32** pRxSeqAddrPtr){};

或者,在您的原始示例中,您可以使用

调用该函数
funct( &pRxSeqAddr[0][0] );

答案 3 :(得分:-3)

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

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

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