傲天 发表于 2015-8-23 12:31:07

2维数组在函数里传递的问题。

代码:
/*****************************
*输出二维数组的任意行、列的值*
*****************************/
#include <stdio.h>
int zhizhen(int (*p)[],int x,int y);
void main()
{
        int a={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};
        int i,j,(*p),u,v;
        p=a;
        printf("请输入行数和列数用空格分开,以回车结束\n");
        scanf("%d%d",&i,&j);
        zhizhen(p,i,j);
}
int zhizhen(int (*p)[],int x,int y)
{
        int u,v;
        for(u=0;u<5;u++)
        {
                for(v=0;v<5;v++)
                {
                        if((x==u) && (y==v))
                        {
                                printf("%d\t",*(*(p+u)+v));
                        }
                        else
                        {
                                printf("?\t");
                        }
                }
                printf("\n\n\n");
        }
}
这是错误提示:
--------------------Configuration: zhizhen - Win32 Debug--------------------
Compiling...
zhizhen.c
E:\1\zhizhen\zhizhen.c(13) : warning C4048: different array subscripts : 'int (*)[]' and 'int (*)'
E:\1\zhizhen\zhizhen.c(13) : warning C4024: 'zhizhen' : different types for formal and actual parameter 1
E:\1\zhizhen\zhizhen.c(9) : warning C4101: 'u' : unreferenced local variable
E:\1\zhizhen\zhizhen.c(9) : warning C4101: 'v' : unreferenced local variable
E:\1\zhizhen\zhizhen.c(24) : error C2036: 'int (*)[]' : unknown size
执行 cl.exe 时出错.

zhizhen.obj - 1 error(s), 0 warning(s)
但是把int zhizhen(int (*p)[],int x,int y);改成int zhizhen(int (*p),int x,int y);后(当然,下面也相应的改正),此程序运行是没有问题的,一维数组就可以不定义数组的大小,那么二维数组是必须定义大小呢还是我程序哪里有问题呢?

melttt 发表于 2015-8-23 13:25:40

melttt 发表于 2015-8-23 13:25
二维数组传递比如int   fun(int a[])或者int fun(int (*a))
第二维的长度必须确定的。至于为什 ...

http://blog.sina.com.cn/s/blog_613e4fea0100hi2d.html

melttt 发表于 2015-8-23 13:25:04

二维数组传递比如int   fun(int a[])或者int fun(int (*a))
第二维的长度必须确定的。至于为什么,和编译原理有关
详细可以看这里:如何将二维数组作为函数的参数传递

yjip267 发表于 2015-8-24 11:05:04

int zhizhen(int (*p)[],int x,int y)改成int zhizhen(int **p,int x,int y),就可以了吧。

傲天 发表于 2015-8-24 12:36:52

yjip267 发表于 2015-8-24 11:05
int zhizhen(int (*p)[],int x,int y)改成int zhizhen(int **p,int x,int y),就可以了吧。

按你说的试了下,结果是一样的,还是提示错误。

yjip267 发表于 2015-8-24 15:34:29

怎么可能。修改了你的代码没有编程工具和环境,你试一下,本来二维数组可以转换成二级指针的。
#include <stdio.h>
int zhizhen(int **p,int x,int y);
void main()
{
      int a={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};
      int i,j,(*p),u,v;//这里要修改一下
      p=a;
      printf("请输入行数和列数用空格分开,以回车结束\n");
      scanf("%d%d",&i,&j);
      zhizhen((int **)p,i,j);
}
int zhizhen(int **p,int x,int y)
{
      int u,v;
      for(u=0;u<5;u++)
      {
                for(v=0;v<5;v++)
                {
                        if((x==u) && (y==v))
                        {
                               // printf("%d\t",*(*(p+u)+v));
                              printf("%d\t",*(p+u*5+v));
                        }
                        else
                        {
                              printf("?\t");
                        }
                }
                printf("\n\n\n");
      }
}

傲天 发表于 2015-8-24 23:14:25

yjip267 发表于 2015-8-24 15:34
怎么可能。修改了你的代码没有编程工具和环境,你试一下,本来二维数组可以转换成二级指针的。
#include
...

int i,j,(*p),u,v;//这里要修改一下。这里要修改成什么呢?也是2级指针的样子?int i,j,**p,u,v;这样吗?

傲天 发表于 2015-8-24 23:17:04

yjip267 发表于 2015-8-24 15:34
怎么可能。修改了你的代码没有编程工具和环境,你试一下,本来二维数组可以转换成二级指针的。
#include
...

咦?成功了,可以显示了,不过那句我没修改,还是原来那句int i,j,(*p),u,v;

傲天 发表于 2015-8-24 23:23:04

yjip267 发表于 2015-8-24 15:34
怎么可能。修改了你的代码没有编程工具和环境,你试一下,本来二维数组可以转换成二级指针的。
#include
...

zhizhen((int **)p,i,j);这句和zhizhen(p,i,j);有什么区别吗?两种我试了试都能运行,结果也正确。能讲一下吗?

傲天 发表于 2015-8-24 23:29:21

yjip267 发表于 2015-8-24 15:34
怎么可能。修改了你的代码没有编程工具和环境,你试一下,本来二维数组可以转换成二级指针的。
#include
...

// printf("%d\t",*(*(p+u)+v));
   printf("%d\t",*(p+u*5+v));
这两句能给讲讲吗?第一个是我写的,第二句是你写的,但有点没法理解啊,你改了这地方,运行就没有错误

yjip267 发表于 2015-8-25 08:53:37

U控件的是行数,V是控件的列数,因为是二级指针,要对行与列进行处理。

yjip267 发表于 2015-8-25 08:56:44

zhizhen((int **)p,i,j),强制转换,因数你的P是,int(*p),如果是int **p,就不用了。后面会讲到的。坚持学习。我也很菜。
页: [1]
查看完整版本: 2维数组在函数里传递的问题。