我有一个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唠叨我...
请帮助
答案 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 ***
第一个数组维度的第一颗星。 (数组是指向第一个项目的指针) 第二个数组维度的第二颗星。 (指向该行第一项的指针) 第三颗星因为物品是指针。