Передача двумерного массива указателя в функцию C - PullRequest
0 голосов
/ 11 ноября 2010

У меня есть двумерный массив указателей

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 ]

5 голосов
/ 11 ноября 2010

Изменить func.c на:

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

}

Как правило, для передачи двумерных массивов в функции необходимо указать размеры массива для всех измерений, кроме первого, поэтому в этом примере вам нужно [2] для последнего измерения, но вы можете опционально опустить его для первого измерения т.е.

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

}

также будет допустимым, но несколько избыточным.

4 голосов
/ 11 ноября 2010

За исключением случаев, когда он является операндом операторов sizeof или унарных & или является строковым литералом, используемым для инициализации другого массива, выражение типа "N-элементный массив T"будет неявно преобразован («распад») в тип «указатель на T», а его значением будет адрес первого элемента массива.

Когда вы вызываете func(pRxSeqAddress), тип выражения pRxSeqAddress преобразуется из "2-элементного массива 2-элементного массива указателя на Int32" в "указатель на 2-элементный массивуказателя на Int32 ", или Int32 *(*)[2].Таким образом, прототип для func должен быть

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

В контексте объявления параметров функции, T a[] и T a[N] являются синонимами T *a;a на самом деле имеет тип указателя, а не типа массива.Таким образом, вышеприведенное может быть переписано как

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

, что выглядит немного чище, чем указатель на синтаксис массива;однако, я предпочитаю первое, так как оно точно описывает, что происходит.Обратите внимание, что это only true в контексте объявления параметра функции.

Таким образом, с учетом объявления T a[N][M];, следующие все имеют значение true

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, всегда и навсегда имеет тип массива.

0 голосов
/ 11 ноября 2010

Это, безусловно, будет работать:

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

void func(Int32** pRxSeqAddrPtr){};

Или, в вашем оригинальном примере, вы можете вызвать функцию с помощью

funct( &pRxSeqAddr[0][0] );
0 голосов
/ 11 ноября 2010

В C по умолчанию 2D array'' are массив указателей на одномерные массивы ''.

Итак, вы должны назвать свой тип: Int32 ***

Первая звездадля первого измерения массива.(массивы являются указателями на их первый элемент) Вторая звезда для второго измерения массива.(указатели на первый элемент строки) Третья звезда, потому что элементы являются указателями.

...