C语言中这个空为什么要填a[][M]?求详细解答!能不能换成其他的?
#include <conio.h>
#include <stdio.h>
#define M 10
int a[M][M] = {0} ;
/**************found**************/
void fun(int a[][M], int m) //这里得a[][M]
{ int j, k ;
for (j = 0 ; j < m ; j++ )
for (k = 0 ; k < m ; k++ )
/**************found**************/
a[j][k] = (k+1) * (j+1) ;
}
void main ( )
{ int i, j, n ;
printf ( " Enter 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" ) ;
}
}
第一,你这个代码有很大的问题,a被声明为全局变量,你就没必要用形参去传递访问a。
第二,给你解释一下形参为什么要写成这样。
1) 传递的时候,形参和实参的数据类型需要一致,所以确定一下实参a是什么类型
2) 实参a是一个数组,但是作为参数使用的时候,数组名代表了指向第一个元素的指针。那么这里面第一个元素是什么呢。
是int [M],为什么第一个元素是一个数组。因为C语言里面根本就没有所谓的多维数组。多维数组都可以当成一维去理解。
包括比如int a[M][M][M],数组名指向的第一个元素的数据类型是 int [M][M],
解释到这里你应该明白了,为什么形参要写成int a[][M]了吧,形参还可以写成 int (*a)[M]
可以换成 int * a
第一种:
#define M 10
int a[M][M] = {0} ;
void fun(int (*a)[M], int m)
{ int j, k ;
for (j = 0 ; j < m ; j++ )
for (k = 0 ; k < m ; k++ )
*((int *)a +j*M +k ) = (k+1) * (j+1) ;
}
void main ( )
{ int i, j, n ;
printf ( " Enter 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" ) ;
}
}
第二种:
#define M 10
int a[M][M] = {0} ;
void fun(int **a, int m)
{ int j, k ;
for (j = 0 ; j < m ; j++ )
for (k = 0 ; k < m ; k++ )
*((int *)a +j*M +k ) = (k+1) * (j+1) ;
}
void main ( )
{ int i, j, n ;
printf ( " Enter n : " ) ; scanf ("%d", &n ) ;
fun ( (int **)a, n ) ;
for ( i = 0 ; i < n ; i++)
{ for (j = 0 ; j < n ; j++)
printf ( "%4d", a[i][j] ) ;
printf ( "\n" ) ;
}
}