C 在函数中使用二维数组:错误
我尝试在2D数组中设置值并使用函数打印它C 在函数中使用二维数组:错误,c,multidimensional-array,C,Multidimensional Array,我尝试在2D数组中设置值并使用函数打印它 #include <stdio.h> void SetArr(int (*arr)[], int n); void PrintfArr(int (*arr)[], int n); int main() { int arr[100][100]; for(int i=0; i<100; i++) for(int j=0; i<100; j++) arr[i][j]=0;
#include <stdio.h>
void SetArr(int (*arr)[], int n);
void PrintfArr(int (*arr)[], int n);
int main()
{
int arr[100][100];
for(int i=0; i<100; i++)
for(int j=0; i<100; j++)
arr[i][j]=0; //initiallize Array
int size;
printf("input Size : "); scanf("%d", &size);
SetArr(arr, size);
PrintfArr(arr, size);
return 0;
}
void SetArr(int (*arr)[], int n)
{
int i, j;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
arr[i][j]=i+j; // Error! "Subscript of Pointer to imcomplete~
}
}
void PrintArr(int (*arr)[], int n)
{
int i, j;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
printf("%d", arr[i][i]); // Error! "Subscript of Pointer to imcomplete~
}
printf("\n");
}
但是我很难将数组发送到函数
#include <stdio.h>
void SetArr(int (*arr)[], int n);
void PrintfArr(int (*arr)[], int n);
int main()
{
int arr[100][100];
for(int i=0; i<100; i++)
for(int j=0; i<100; j++)
arr[i][j]=0; //initiallize Array
int size;
printf("input Size : "); scanf("%d", &size);
SetArr(arr, size);
PrintfArr(arr, size);
return 0;
}
void SetArr(int (*arr)[], int n)
{
int i, j;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
arr[i][j]=i+j; // Error! "Subscript of Pointer to imcomplete~
}
}
void PrintArr(int (*arr)[], int n)
{
int i, j;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
printf("%d", arr[i][i]); // Error! "Subscript of Pointer to imcomplete~
}
printf("\n");
}
#包括
无效SetArr(内部(*arr)[],内部n);
无效打印文件(内部(*arr)[],内部编号);
int main()
{
国际航空公司[100][100];
对于(int i=0;i,在函数声明中,数组必须与其大小(长度)一起提及。这就是编译器在说“不完整类型”时的意思:它需要大小来理解如何访问其元素
为了使编译器可以使用大小,它应该首先在函数声明中:
void SetArr(int n, int (*arr)[n])
这里的arr
在技术上是一个“指向n
元素数组的指针”,但在C语言中,通常将指针视为数组,因此arr
可以被视为“一个n
元素数组”,这与二维数组相同
您可能希望提及阵列的两个维度:
void SetArr(int n, int arr[n][n])
这相当于第一个声明,但看起来更清晰。声明如下函数
void SetArr( int ( *arr )[100], int n );
void PrintfArr( int ( *arr )[100], int n );
您不能声明您标记为最佳的答案中显示的函数
考虑下面的代码,我使用3代替100表示数组维度。
如果您将在函数PrintArr和main中打印数组,您将得到不同的结果
#include <stdio.h>
void SetArr( size_t n, int (*arr)[n] )
void PrintArr( size_t n, int (*arr)[n] )
int main(void)
{
int arr[3][3];
size_t n = 2;
SetArr( n, arr );
PrintArr( n, arr );
printf( "\n" );
for ( size_t i = 0; i < n; i++ )
{
for ( size_t j = 0; j < n; j++ ) printf( "%2d", arr[i][j] );
printf( "\n" );
}
return 0;
}
void SetArr( size_t n, int (*arr)[n] )
{
for ( size_t i = 0; i < n; i++ )
{
for ( size_t j = 0; j < n; j++ ) arr[i][j] = i * n + j;
}
}
void PrintArr( size_t n, int (*arr)[n] )
{
for ( size_t i = 0; i < n; i++ )
{
for ( size_t j = 0; j < n; j++ ) printf( "%2d", arr[i][j] );
printf( "\n" );
}
}
正如您所看到的,第一个输出与第二个输出不一致。如果像我在文章开头指出的那样声明函数,您将得到正确的结果
#include <stdio.h>
void SetArr( int (*arr)[3], size_t n );
void PrintArr( int (*arr)[3], size_t n );
int main(void)
{
int arr[3][3];
size_t n = 2;
SetArr( arr, n );
PrintArr( arr, n );
printf( "\n" );
for ( size_t i = 0; i < n; i++ )
{
for ( size_t j = 0; j < n; j++ ) printf( "%2d", arr[i][j] );
printf( "\n" );
}
return 0;
}
void SetArr( int (*arr)[3], size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
for ( size_t j = 0; j < n; j++ ) arr[i][j] = i * n + j;
}
}
void PrintArr( int (*arr)[3], size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
for ( size_t j = 0; j < n; j++ ) printf( "%2d", arr[i][j] );
printf( "\n" );
}
}
正如您在本例中所看到的,这两个输出是一致的。如果没有其他任何输出:调用printf(“%d”,arr[i][i]);
调用PrintArr
应该修改为printf(“%d”,arr[i][j]);
…int(*arr)[]
没有指定指向的数组的大小…因此编译器无法知道函数中2D数组中的行有多大。如果使用int(*arr)[100]
,它应该可以工作…虽然那时你的行大小固定在100int
s@Dmitri哇谢谢…我觉得真的很愚蠢哈哈。我记得了谢谢!使用C99,你也可以执行void SetArr(int n,int(*arr)[n])
@eureurung在我看来,您将一个不正确的答案标记为最佳答案,因为相对于您的代码,数组没有维度n*n。请参阅我的答案。例如,请在设置元素后尝试在main中打印它。
0 1
2 3
0 1
2 3