将2D指针数组传递给具有1D指针数组参数的函数

时间:2013-10-19 12:57:13

标签: c arrays pointers

我目前正在做一个项目,我将把一个2D指针数组传递给一个函数。这是函数实现:

void
affiche_Tab2D(int *ptr, int n, int m)
{
    if (n>0 && m>0 && ptr!=NULL)
    {
        int (*lignePtr)[m]; // <-- Its my first time to see this declaration

        lignePtr = (int (*)[m]) ptr; // <-- and this too....

        for (int i = 0 ; i < n ; i++)
        {
            for (int j = 0 ; j < m ; j++) 
            {
                printf("%5d ",lignePtr[i][j]);
            }
            printf("\b\n");
        }
    }
}

请注意,ptr是2D数组,但它使用单个指针。之前,我曾经使用双指针传递2D数组。在我的主要内容中,我设置了一个2D数组(双指针),并找到了如何将其发送到该函数的方法。

以下是我尝试的函数调用,但不起作用:

int 
main(int argc, char * argv[]) 
{
    int ** numbers_table;
    int i, j;

    numbers_table = (int **)malloc(10 * sizeof(int *));

    for(i = 0; i < 10; i++)
        numbers_table[i] = (int *)malloc(10 * sizeof(int));

    for(i = 0; i < 10; i++)
        for(j = 0; j < 10; j++)
            numbers_table[i][j] = i + j;

    // Failed function call 1
    // affiche_Tab2D(numbers_table, 10, 10);

    // Failed function call 2
    // affiche_Tab2D(&numbers_table, 10, 10);

    for(i = 0; i < 10; i++)
    free(numbers_table[i]);

    free(numbers_table);

    return 0;
}

1 个答案:

答案 0 :(得分:2)

您无法将numbers_table传递给您的函数,因为它的类型为int **而您的函数期望int *。此外,您无法通过&numbers_table,因为它的类型为int ***int的指针传递给函数传递&numbers_table[0][0],类型为int *

affiche_Tab2D(&numbers_table[0][0], 10, 10);  

根据OP的评论:

  

我想了解更多关于声明int (*lignePtr)[m]lignePtr = (int (*)[m]) ptr;的解释,这有点令人困惑。

int (*lingPtr)[m]是指向m个元素的数组(整数)的指针 lignePtr = (int (*)[m]) ptr;正在将ptr转换为指向m元素数组的指针。