鱼C论坛

 找回密码
 立即注册
查看: 2389|回复: 11

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

[复制链接]
发表于 2015-8-23 12:31:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码:
/*****************************
*输出二维数组的任意行、列的值*
*****************************/
#include <stdio.h>
int zhizhen(int (*p)[],int x,int y);
void main()
{
        int a[5][5]={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)[5],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 (*)[5]'
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)[5],int x,int y);后(当然,下面也相应的改正),此程序运行是没有问题的,一维数组就可以不定义数组的大小,那么二维数组是必须定义大小呢还是我程序哪里有问题呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
傲天 + 1 + 1 非常感谢!热爱鱼C^_^!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-23 13:25:04 | 显示全部楼层
二维数组传递比如int   fun(int a[][3])或者int fun(int (*a)[3])  
第二维的长度必须确定的。至于为什么,和编译原理有关
详细可以看这里:如何将二维数组作为函数的参数传递
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-24 11:05:04 | 显示全部楼层
int zhizhen(int (*p)[],int x,int y)改成int zhizhen(int **p,int x,int y),就可以了吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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),就可以了吧。

按你说的试了下,结果是一样的,还是提示错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-24 15:34:29 | 显示全部楼层
怎么可能。修改了你的代码没有编程工具和环境,你试一下,本来二维数组可以转换成二级指针的。
#include <stdio.h>
int zhizhen(int **p,int x,int y);
void main()
{
        int a[5][5]={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)[5],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");
        }
}

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
傲天 + 1 + 1 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

int i,j,(*p)[5],u,v;//这里要修改一下。这里要修改成什么呢?也是2级指针的样子?int i,j,**p,u,v;这样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

咦?成功了,可以显示了,不过那句我没修改,还是原来那句int i,j,(*p)[5],u,v;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

zhizhen((int **)p,i,j);这句和zhizhen(p,i,j);有什么区别吗?两种我试了试都能运行,结果也正确。能讲一下吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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));
这两句能给讲讲吗?第一个是我写的,第二句是你写的,但有点没法理解啊,你改了这地方,运行就没有错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-25 08:53:37 | 显示全部楼层
U控件的是行数,V是控件的列数,因为是二级指针,要对行与列进行处理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-25 08:56:44 | 显示全部楼层
zhizhen((int **)p,i,j),强制转换,因数你的P是,int(*p)[5],如果是int **p,就不用了。后面会讲到的。坚持学习。我也很菜。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 07:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表