分类: C/C++
2009-03-31 21:40:24
最近写c程序时才发现之前的c语言确实没学好啊,一个简单的二维数组名作为参数传递的问题都花了好长时间才解决。
以下是一个简单的测试程序:
通过调用一个函数InitArray(int **array)初始化一个二维数组
1 #include
2 #define ROW 3
3 #define COL 3
4 void InitArray(int **Array);
5 int main()
6 {
7 int i,j,Array[ROW][COL];
8 int *p[ROW];
9 for(i=0;i
11 p[i]=Array[i];
12 }
13 InitArray(p); /*注释一*/
14 /*InitArray((int **)Array);*/ /*注释二*/
15 for(i=0; i
17 printf("\n");
18 for(j=0; j
20 printf("%d ",Array[i][j]);
21 }
22 }
23 return 0;
24
25 }
26 void InitArray(int **Array)
27 {
28
29 int i,j,k=0;
30 for(i=0; i
33 printf("input your %dth number:",++k);
34 /* scanf("%d",&Array[i][j]); */ /*注释三*/
35 scanf("%d",(Array+COL*j+i)); /*注释四*/
36 }
37
38 }
用gcc编译后出现警告
maan.c: 在函数‘InitArray’中:
maan.c:35: 警告: 格式‘%d’需要类型‘int *’,但实参 2 的类型为‘int **’
运行当执行打印数组时出现错误
input your 1th number:1
input your 2th number:2
input your 3th number:3
input your 4th number:4
input your 5th number:5
input your 6th number:6
input your 7th number:7
input your 8th number:8
input your 9th number:9
0 0 0
-1080424648 -1209541106 -1208825479
段错误
这是因为系统无法确定具体的地址。
当采用注释二和注释四搭配时编译出现警告
maan.c: 在函数‘InitArray’中:
maan.c:35: 警告: 格式‘%d’需要类型‘int *’,但实参 2 的类型为‘int **’
但是可以执行成功结果为:
input your 1th number:1
input your 2th number:2
input your 3th number:3
input your 4th number:4
input your 5th number:5
input your 6th number:6
input your 7th number:7
input your 8th number:8
input your 9th number:9
1 4 7
2 5 8
3 6 9
如果调用InitArray(int**Array)函数时直接传入二维数组名而不对他进行强制转换,那编译将会出现警告(假设该文件名为maan.c)
maan.c: 在函数‘main’中:
maan.c:13: 警告: 传递参数 1 (属于‘InitArray’)时在不兼容的指针类型间转换
maan.c: 在函数‘InitArray’中:
maan.c:34: 警告: 格式‘%d’需要类型‘int *’,但实参 2 的类型为‘int **’
这是指针类型不匹配引起的。但是这个程序却可以正常执行结果为
input your 1th number:1
input your 2th number:2
input your 3th number:3
input your 4th number:4
input your 5th number:5
input your 6th number:6
input your 7th number:7
input your 8th number:8
input your 9th number:9
1 4 7
2 5 8
3 6 9
如果将函数InitArray(int **Array)改为InitArray(int *Array)
编译后结果为
maan.c: 在函数‘main’中:
maan.c:13: 警告: 传递参数 1 (属于‘InitArray’)时在不兼容的指针类型间转换
但是依然可以执行结果为:
input your 1th number:1
input your 2th number:2
input your 3th number:3
input your 4th number:4
input your 5th number:5
input your 6th number:6
input your 7th number:7
input your 8th number:8
input your 9th number:9
1 4 7
2 5 8
3 6 9
今天同学又给提供了一种方法,如果将注释三和注释四改为scanf("%d",(*(Array+i)+j));则无论用注释一还是注释二均可正常执行。看来还是对二维数组的地址确定问题理解不够。
另外一种方法:(由兰鹏提供)
#include
#define ROW 3
#define COL 3
void InitArray(int Array[ROW][COL]);
int main()
{
int i,j,Array[ROW][COL];
InitArray(Array);
for(i=0; i
{
printf("\n");
for(j=0; j
{
printf("%d ",Array[i][j]);
}
}
printf("\n");
return 0;
}
void InitArray(int Array[ROW][COL])
{
int i,j,k=0;
for(i=0; i
for(j=0; j
{
printf("input your %dth number:",++k);
scanf("%d",&Array[i][j]);
}
}