请问如何把一个二维数组作为函数参数传进一个函数?

hqt1979 2004-06-27 10:24:23
请问如何把一个二维数组作为函数参数传进一个函数?
例如:


void tt(char **str)
{
}
void main()
{
char str[20][20];
tt(str);
}

以上程序编译通不过,请问函数tt的参数应该是什么,才能把二维数组传进去??
谢谢回复!!
...全文
1783 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tuqvb 2004-06-28
  • 打赏
  • 举报
回复
如果是一个二维数组,例如: int a[3][4]
如果将a 作为参数传递给函数的话,函数的参数应该定义为 :int (*p)[4],此时便可顺利访问。

错了,不只编译通不过,而且仔细考虑一下内存分布
即时能通过编译,想一想到时候p[0..4]的内容各是什么呢?
tuqvb 2004-06-28
  • 打赏
  • 举报
回复
void tt(int rs,int cs,char ar[rs][cs]) //(char *str)
{
}
编译器会羞辱你的,因为要让它处理数组,你必须将数组的各维(低n-1维)界定设为常数
即让它在编译期间就能知道数组的大小

应该是void tt(int rs, int cs, char ar[][20])
这样才能编译通过,但是恐怕使用起来非常不爽,因为有一维的大小被定死了
fanglinlin7841 2004-06-28
  • 打赏
  • 举报
回复
如果是一个二维数组,例如: int a[3][4]
如果将a 作为参数传递给函数的话,函数的参数应该定义为 :int (*p)[4],此时便可顺利访问。代码如下:
#include <stdio.h>
void f( int (*p)[4]);
void main()
{
int a[3][4];

for( int i=0;i<3;i++)
for(int j=0;j<4;j++)
a[i][j]=i;
f(a);
}

void f( int (*p)[4])
{
printf("%d",*(*(p+1)+2); //此时访问的是a[1][2]
}
Jarrylogin 2004-06-28
  • 打赏
  • 举报
回复
void tt(char a[][20])或者 void tt(char (*a)[20])数组指针的形式
yux007 2004-06-28
  • 打赏
  • 举报
回复
关注
peter9606 2004-06-28
  • 打赏
  • 举报
回复
我帮你 ding 偶也是看了C++ Primer上面这样说的 至于为什么恐怕要那些对编译器很熟悉的大牛们来指点了
hqt1979 2004-06-28
  • 打赏
  • 举报
回复
首先非常感谢各位朋友的热心讨论!
的确,如以上朋友所说:若函数的参数是二维数组,函数原型应该写成这种形式:
void tt(char a[][20])或者 void tt(char (*a)[20])或者降为一维数组来处理。

但现在我有点搞不明白,为什么不能指明第一维的维数呢?编译器为什么要这样做?
那位朋友能解释一下原因,让大家理解的更透彻一些。
groock 2004-06-28
  • 打赏
  • 举报
回复
我在main里不知道为什么可以用
int test(char *fun[])
int main(int argc, char *argv[])
调用函数:test(argv)
这样子可以的
peter9606 2004-06-28
  • 打赏
  • 举报
回复
总结一下:
如果参数是多维数组,那么参数必须指明第一维意外得所有未得长度:比如你的
void tt(char a[][20])或者 void tt(char (*a)[20])

另外这样也是可以的
char *a[10] ;
tt(a);
tt(&a[0]);

liu_feng_fly 2004-06-28
  • 打赏
  • 举报
回复
使用STL啊,用vector
jaredcsdn 2004-06-28
  • 打赏
  • 举报
回复
要我说就不要挖空心思了

直接 void tt(char *str, unsigned n) 算了

用 *(str+i*n+j) 取值死不了人的.

说白了, C在根本上就不支持二维数组, 楼主何必强求.
bribin 2004-06-28
  • 打赏
  • 举报
回复
只要改成void tt(char a[][20])就可以了
somjet 2004-06-27
  • 打赏
  • 举报
回复
如果你是想得到数组中一个元素得位置,你可以用上面的方法,要是你想得到二维数组中的某个值你可以用变长数组来解决;
void tt(int rs,int cs,char ar[rs][cs]) //(char *str)
{
}
void main()
{ int r,c;
scanf("%d %",r,c);
char str[20][20];
tt(r,c,str);
}
可能我领悟错了,但这是我给的建议,谢谢
613613 2004-06-27
  • 打赏
  • 举报
回复
void tt(char **str) //(char *str)
{
}
void main()
{
char str[20][20];
tt(str); //tt(str[0])
}
偶菜,只会这样,,,5
613613 2004-06-27
  • 打赏
  • 举报
回复
上面错了,,不好意思,,偶菜
613613 2004-06-27
  • 打赏
  • 举报
回复
tt(str):这里面的str是个行指针(该行含20个元素),而char **str是个指向字符的指针。
所以不匹配。函数tt的参数应该是指向字符元素的,如:str[0].

69,383

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧