下列给定程序中,函数fun()的功能是:根据形参m的值(2≤m≤9),在m行m列的二维数组中存放如下所示的数据,由 main()函数输出。 例如,若输入2,则输出1 2 2 4 输入4,则输出1 2 3 42 4 6 83 6 9 124 8 12 16 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构. 试题程序: #include <conio.h> #include <stdio. h> #define M 10 int aiM] [MI={0}; /***************found*******************/ fun( int **a, int m) {int j,k; for (j=0; j<m; j++) for (k=0; k<m; k++) /***************found*******************/a[j] [k]=k*j; } main ( ) {int i, j, n; clrscr (); printf ("Enter n\n"); scanf ("%d", &n); fun (a, n); for (i=0; i<n; i++) { for (j=0;j<n;j++) printf ("%4d ",a[i] [j]); printf ("\n "); } }
参考答案:错误:fun(int**a, int m) 正确:void fun(int(*a)[M],int m)
解析:(2)错误:a[j][k]=k*j; 正确:a[j][k]=(k+1)*(j+1); 对于二维数组,应该理解成为是由几个一维数组作元素组成的一维数组,或者说,二维数组实际是一个一维数组,只不过它的每个数组元素又都是一个一维数组。我们先来看看指针数组的表示形式: (1)p+i和a+i均表示a[i]的地址,或者讲,它们均指向数组第i号元素,即指向a[i]。 (2)*(p+i)和*(a+i)都表示p+i和a+i所指对象的内容,即为a[i]。 (3)指向数组元素的指针,也可以表示成数组的形式,也就是说,它允许指针变量带下标,如p[i]与*(p+i)等价。因此,二维数组元素a[i][j]可表示成*(a[i]+j)或*(*(a+i)+j),它们都与a[i][j]等价,或者还可写成(*(a+i))[j]。了解了以上这些内容后本题就好解决了。