0

我目前正在做一个项目,我将一个二维指针数组传递给一个函数。下面是函数实现:

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 是二维数组,但它使用单个指针。以前,我曾经使用双指针传递二维数组。在我的主目录中,我设置了一个二维数组(双指针)并找到了如何将其发送到该函数的方法。

这是我尝试过的不起作用的函数调用:

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;
}
4

1 回答 1

2

你不能传递numbers_table给你的函数,因为它是int **你的函数期待的类型int *。你也不能通过&numbers_table,因为它是 type int ***
传递一个指向int你的函数 pass的指针&numbers_table[0][0],有一个 type 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元素数组的指针。

于 2013-10-19T13:19:29.450 回答