我正在尝试使用(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;
}
答案 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] );
}
}
}