我尝试在2D数组中设置值并使用Function打印它。
但是我很难将数组发送到函数。
#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");
}
如您所见,两个功能在使用&#34; arr [] []&#34;
时遇到了同样的问题答案 0 :(得分:1)
在函数声明中,必须提及数组的大小(长度)。这就是编译器在表示“不完整类型”时的含义:它需要大小来理解如何访问其元素。
为了使编译器可以使用大小,它应首先在函数声明中使用:
void SetArr(int n, int (*arr)[n])
这里arr
在技术上是“指向n
元素数组的指针”,但在C语言中,习惯上将指针视为数组,因此arr
可以被视为“一组n
元素数组“,与二维数组相同。
您可能想要提及数组的两个维度:
void SetArr(int n, int arr[n][n])
这相当于第一个声明,但似乎更清楚。
答案 1 :(得分:0)
声明像
这样的函数void SetArr( int ( *arr )[100], int n );
void PrintfArr( int ( *arr )[100], int n );
您不能声明您标记为最佳
的答案中显示的功能考虑以下代码而不是100我使用3作为数组维度。 如果您将在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" );
}
}
程序输出
0 1
2 3
0 1
3 1
如您所见,第一个输出与第二个输出不一致。如果函数声明为我在帖子开头指出的函数,您将得到正确的结果。例如
#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" );
}
}
程序输出
0 1
2 3
0 1
2 3
正如您在本案中所看到的,两个输出重合。