【问题标题】:Passing 2D array of pointer to function C将二维指针数组传递给函数C
【发布时间】:2026-01-25 22:20:03
【问题描述】:

我有一个二维指针数组

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 **

我知道如果它是一维指针数组,那么这个函数调用很好,但是 2D 困扰着我..

请帮忙

【问题讨论】:

    标签: c arrays function pointers 2d


    【解决方案1】:

    将 func.c 更改为:

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

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

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

    也是有效的,但有些多余。

    【讨论】:

    • 嗨,保罗,谢谢它的工作原理......但我不知道如何解释这背后的逻辑......
    • @user437777:好的-我已经添加了更多说明-HTH
    • 嗨,Paul,谢谢澄清...我检查了它在函数内部传递的值。它已正确地将第一列和第二列的地址传递给我。要获取行地址,我是否需要使用某种指针偏移量手动提取?
    • @user437777:如果你真的需要知道给定行的地址i,那么它只是pRxSeqAddrPtr[i],或者&pRxSeqAddrPtr[i][0],无论你喜欢哪个.但是,您可能并不真的需要知道这一点 - 您到底想做什么?
    【解决方案2】:

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

    当您调用func(pRxSeqAddress) 时,表达式pRxSeqAddress 的类型从“指向Int32 的2 元素数组的2 元素数组”转换为“指向指向2 元素数组的指针的指针” Int32",或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];,以下所有内容都成立

    表达式类型衰减到 ---------- ---- --------- 一个 T [N][M] T (*)[M] &a T (*)[N][M] 不适用 *a T [M] T * a[i] T [M] T * &a[i] T (*)[M] 不适用 *a[i] 不适用 a[i][j] 不适用

    注意,改变的是引用数组的表达式的类型,而不是数组本身; main 中定义的 object pRxSeqAddr 始终是数组类型。

    【讨论】:

      【解决方案3】:

      这肯定会奏效:

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

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

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

      【讨论】:

      • 它可能“有效”,但并不能真正回答问题,因为它只是避免了传递二维数组的问题。
      • 更改数组的类型而不是修复参数似乎是错误的做法。
      • @Paul R 在你的情况下,函数被锁定为大小[2]。也许 OP 只需要在函数中添加一个简单的普通指针?
      • OP 提出了一个关于传递固定大小的 2D 数组的具体问题 - 恕我直言,最好回答 as ask 的问题,而不是尝试猜测 OP 可能有什么而是想要 - 如果需要,他总是可以稍后澄清问题。
      • 这涉及到使用数组时更复杂的数学。
      【解决方案4】:

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

      因此,您必须将类型命名为:Int32***

      第一个数组维度的第一个星号。 (数组是指向它们的第一项的指针) 第二个数组维度的第二颗星。 (指向行的第一项的指针) 第三颗星,因为项目是指针。

      【讨论】:

      • 这里存储为一维数组。