Chinaunix首页 | 论坛 | 博客
  • 博客访问: 928587
  • 博文数量: 146
  • 博客积分: 3321
  • 博客等级: 中校
  • 技术积分: 1523
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-29 10:32
文章分类

全部博文(146)

文章存档

2014年(2)

2013年(5)

2012年(4)

2011年(6)

2010年(30)

2009年(75)

2008年(24)

分类: 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 10     {
 11         p[i]=Array[i];
 12     }
 13     InitArray(p);    /*注释一*/
 14     /*InitArray((int **)Array);*/   /*注释二*/
 15     for(i=0; i 16     {
 17         printf("\n");
 18         for(j=0; j 19         {
 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 31         for(j=0; j 32         {
 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]);
        }  
}




阅读(8633) | 评论(0) | 转发(0) |
0

上一篇:uc/os 和 uclinux 比较

下一篇:c内联汇编

给主人留下些什么吧!~~