在函数中使用2D数组:错误

我尝试在2D数组中设置值并使用Function打印它。

但我很难将数组发送到函数。

#include  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"); } 

如您所见,使用“arr [] []时,两个函数都有同样的问题

在函数声明中,必须提及数组的大小(长度)。 这就是编译器在说“不完整类型”时的含义:它需要大小来理解如何访问其元素。

为了使编译器可以使用大小,它应该首先在函数的声明中:

 void SetArr(int n, int (*arr)[n]) 

这里arr在技​​术上是“指向n元素数组的指针”,但是在C中习惯上将指针视为数组,因此arr可以被视为“ n元素的数组数组”,这与a相同二维arrays。

您可能想要提及数组的两个维度:

 void SetArr(int n, int arr[n][n]) 

这相当于第一个声明,但似乎更清楚。

声明像这样的函数

 void SetArr( int ( *arr )[100], int n ); void PrintfArr( int ( *arr )[100], int n ); 

您可能不会声明您标记为最佳答案中显示的function

考虑以下代码而不是100我使用3作为数组维度。 如果您将在PrintArr函数和main中打印数组,您将得到不同的结果!

 #include  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" ); } } 

程序输出是

  0 1 2 3 0 1 3 1 

如您所见,第一个输出与第二个输出不一致。 如果函数声明为我在post开头指出的那样,你会得到正确的结果。 例如

 #include  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" ); } } 

程序输出是

  0 1 2 3 0 1 2 3 

正如您在本案中所看到的,两个输出重合。