二维数组传递

时间:2018-04-01 20:33:49

标签: c arrays function

我正在尝试使用(int **)将2D数组传递给函数。但是在函数内部,我只能访问每一行的第一个元素。如何像普通的二维阵列一样访问数组?或者如何从函数内部访问所有元素?

我使用的是基于GCC V 7.1.1的在线编译器,可以通过[https://www.tutorialspoint.com/compile_c_online.php]

访问
#include <stdio.h>

void check(int s, int ** list)
{
    int i;
    for(i=0; i < s*2; i++)
    {
        printf("%d ",list[i]);
    }
}

int main()
{
    int j;
    int x[3][2] = {{1,1},{3,4},{2,5}};

    check(3, (int **)x);

    return 0;
}

2 个答案:

答案 0 :(得分:2)

将数组传递给函数时,函数会接收指向数组第一个元素的指针。

但是当你将一个数组数组(也称为&#34;二维&#34;数组)传递给一个函数时,该函数会接收一个指向指针的指针。该函数接收一个指向(外部)数组的第一个元素的指针 - 在这种情况下,它是指向其中一个内部数组的指针。

也就是说,因为你有数组

int x[3][2];

你打电话

check(3, x);

函数check()的声明必须是

void check(int s, int list[3][2])

void check(int s, int (*list)[2])

然后你需要决定你实际想要如何访问函数中的list,因为printf("%d ",list[i])几乎不会在list的任何声明中删除它,你有一个或我建议的两个中的任何一个。 (%d建议您尝试打印整数,但需要两个下标才能从list转到可以打印的int。)

我将函数check改写为

void check(int s, int (*list)[2])
{
    int i;
    for(i=0; i < s; i++)
    {
        printf("%d %d\n",list[i][0], list[i][1]);
    }
}

它按预期工作。

或者,如果你真的想要迭代&#34;展平&#34;数组,您可以将函数check写为

void check(int s, int *list)
{
    int i;
    for(i=0; i < s*2; i++)
    {
        printf("%d ", list[i]);
        if(i % 2 == 1) printf("\n");
    }
}

在这种情况下你会这样称呼它:

check(3, &x[0][0]);

在这种情况下,函数check正在接收指向int的(单级)指针,而不是指向指针的指针。

请注意,我在任何地方都不需要任何明确的演员表。您原始代码(int **)x中的演员阵容是一面红旗,几乎可以保证出现问题。

另请参阅C FAQ list,问题6.18

答案 1 :(得分:1)

传递的参数不是指向指针

的指针

C编译器需要具有最里面索引的大小,因此它可以生成所需的代码。

以下提议的代码执行所需的功能,干净地编译等等。

#include <stdio.h>

#define NUM_ROWS 3
#define NUM_COLS 2

void check( int list[][ NUM_COLS ]);

int main( void )
{
    int x[ NUM_ROWS ][ NUM_COLS ] = {{1,1},{3,4},{2,5}};

    check( x );

    return 0;
}


void check( int list[][ NUM_COLS ])
{
    for( int i=0; i < NUM_ROWS; i++)
    {
        for( int j=0; j< NUM_COLS; j++ )
        {
            printf( "%d ", list[i][j] );
        }
    }
}

这是结果输出

1 1 3 4 2 5 

生成一个指向指针的指针,代码需要类似于:

#include <stdio.h>
#include <stdlib.h>

#define NUM_ROWS 3
#define NUM_COLS 2

void check( int **list );

int main( void )
{
    int **x = malloc( sizeof(int*) * NUM_ROWS ); // be sure to add check for success

    for( int i = 0; i<NUM_ROWS; i++ )
    {
        x[i] = malloc( sizeof(int) * NUM_COLS ); // be sure to add check for success
    }

    (x[0])[0] = 1;
    (x[0])[1] = 1;
    (x[1])[0] = 3;
    (x[1])[1] = 4;
    (x[2])[0] = 2;
    (x[2])[1] = 5;

    check( x );

    for( int x=0; i< NUM_ROWS; i++ )
    {
        free( x[i] );
    }

    free( x );
    return 0;
}


void check( int **list)
{
    for( int i=0; i < NUM_ROWS; i++)
    {
        for( int j=0; j< NUM_COLS; j++ )
        {
            printf( "%d ", list[i][j] );
        }
    }
}