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
二维数组传递比如int fun(int a[])或者int fun(int (*a))
第二维的长度必须确定的。至于为什 ...
http://blog.sina.com.cn/s/blog_613e4fea0100hi2d.html 二维数组传递比如int fun(int a[])或者int fun(int (*a))
第二维的长度必须确定的。至于为什么,和编译原理有关
详细可以看这里:如何将二维数组作为函数的参数传递 int zhizhen(int (*p)[],int x,int y)改成int zhizhen(int **p,int x,int y),就可以了吧。 yjip267 发表于 2015-8-24 11:05
int zhizhen(int (*p)[],int x,int y)改成int zhizhen(int **p,int x,int y),就可以了吧。
按你说的试了下,结果是一样的,还是提示错误。 怎么可能。修改了你的代码没有编程工具和环境,你试一下,本来二维数组可以转换成二级指针的。
#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");
}
} yjip267 发表于 2015-8-24 15:34
怎么可能。修改了你的代码没有编程工具和环境,你试一下,本来二维数组可以转换成二级指针的。
#include
...
int i,j,(*p),u,v;//这里要修改一下。这里要修改成什么呢?也是2级指针的样子?int i,j,**p,u,v;这样吗? yjip267 发表于 2015-8-24 15:34
怎么可能。修改了你的代码没有编程工具和环境,你试一下,本来二维数组可以转换成二级指针的。
#include
...
咦?成功了,可以显示了,不过那句我没修改,还是原来那句int i,j,(*p),u,v; yjip267 发表于 2015-8-24 15:34
怎么可能。修改了你的代码没有编程工具和环境,你试一下,本来二维数组可以转换成二级指针的。
#include
...
zhizhen((int **)p,i,j);这句和zhizhen(p,i,j);有什么区别吗?两种我试了试都能运行,结果也正确。能讲一下吗? yjip267 发表于 2015-8-24 15:34
怎么可能。修改了你的代码没有编程工具和环境,你试一下,本来二维数组可以转换成二级指针的。
#include
...
// printf("%d\t",*(*(p+u)+v));
printf("%d\t",*(p+u*5+v));
这两句能给讲讲吗?第一个是我写的,第二句是你写的,但有点没法理解啊,你改了这地方,运行就没有错误 U控件的是行数,V是控件的列数,因为是二级指针,要对行与列进行处理。 zhizhen((int **)p,i,j),强制转换,因数你的P是,int(*p),如果是int **p,就不用了。后面会讲到的。坚持学习。我也很菜。
页:
[1]