依睛(IT blog) 我回来了,PHP<-->C/C++ LINUX

笨鸟

统计

积分与排名

友情连接

最新评论

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

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

楼主hqt1979()2004-06-27 22:24:23 在 C/C++ / C语言 提问

请问如何把一个二维数组作为函数参数传进一个函数?  
  例如:  
   
   
  void   tt(char   **str)  
  {  
  }  
  void   main()  
  {  
      char   str[20][20];  
      tt(str);  
  }  
   
  以上程序编译通不过,请问函数tt的参数应该是什么,才能把二维数组传进去??  
  谢谢回复!! 问题点数:20、回复次数:16Top

1 楼613613(无余) 回复于 2004-06-27 23:03:29 得分 0

tt(str):这里面的str是个行指针(该行含20个元素),而char   **str是个指向字符的指针。  
  所以不匹配。函数tt的参数应该是指向字符元素的,如:str[0].Top

2 楼613613(无余) 回复于 2004-06-27 23:10:52 得分 0

上面错了,,不好意思,,偶菜Top

3 楼613613(无余) 回复于 2004-06-27 23:30:52 得分 0

void   tt(char   **str)       //(char   *str)  
  {  
  }  
  void   main()  
  {  
      char   str[20][20];  
      tt(str);       //tt(str[0])  
  }  
  偶菜,只会这样,,,5Top

4 楼somjet(求救的) 回复于 2004-06-27 23:51:49 得分 0

如果你是想得到数组中一个元素得位置,你可以用上面的方法,要是你想得到二维数组中的某个值你可以用变长数组来解决;  
  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);        
  }  
  可能我领悟错了,但这是我给的建议,谢谢Top

5 楼fanglinlin7841(猫猫) 回复于 2004-06-28 00:36:37 得分 10

如果是一个二维数组,例如:   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]  
  }  
  Top

6 楼tuqvb(风间苍月) 回复于 2004-06-28 00:42:22 得分 0

void   tt(int   rs,int   cs,char   ar[rs][cs])       //(char   *str)  
  {  
  }  
  编译器会羞辱你的,因为要让它处理数组,你必须将数组的各维(低n-1维)界定设为常数  
  即让它在编译期间就能知道数组的大小  
   
  应该是void   tt(int   rs,   int   cs,   char   ar[][20])  
  这样才能编译通过,但是恐怕使用起来非常不爽,因为有一维的大小被定死了  
  Top

7 楼tuqvb(风间苍月) 回复于 2004-06-28 00:50:38 得分 0

如果是一个二维数组,例如:   int   a[3][4]  
  如果将a   作为参数传递给函数的话,函数的参数应该定义为   :int   (*p)[4],此时便可顺利访问。  
   
  错了,不只编译通不过,而且仔细考虑一下内存分布  
  即时能通过编译,想一想到时候p[0..4]的内容各是什么呢?Top

8 楼bribin(锐冰) 回复于 2004-06-28 01:56:17 得分 0

只要改成void   tt(char   a[][20])就可以了Top

9 楼peter9606( 荷尔蒙一失效 人就清醒了) 回复于 2004-06-28 07:58:03 得分 10

总结一下:  
  如果参数是多维数组,那么参数必须指明第一维意外得所有未得长度:比如你的    
  void   tt(char   a[][20])或者   void   tt(char   (*a)[20])  
   
  另外这样也是可以的  
  char   *a[10]   ;  
  tt(a);  
  tt(&a[0]);  
   
  Top

10 楼vbar(S.Q.Y) 回复于 2004-06-28 09:15:52 得分 0

我在main里不知道为什么可以用  
  int   test(char   *fun[])  
  int   main(int   argc,   char   *argv[])  
  调用函数:test(argv)  
  这样子可以的Top

11 楼hqt1979() 回复于 2004-06-28 10:30:08 得分 0

首先非常感谢各位朋友的热心讨论!  
  的确,如以上朋友所说:若函数的参数是二维数组,函数原型应该写成这种形式:  
  void   tt(char   a[][20])或者   void   tt(char   (*a)[20])或者降为一维数组来处理。  
   
  但现在我有点搞不明白,为什么不能指明第一维的维数呢?编译器为什么要这样做?  
  那位朋友能解释一下原因,让大家理解的更透彻一些。Top

12 楼peter9606( 荷尔蒙一失效 人就清醒了) 回复于 2004-06-28 10:35:53 得分 0

我帮你   ding   偶也是看了C++   Primer上面这样说的   至于为什么恐怕要那些对编译器很熟悉的大牛们来指点了Top

13 楼yux007(yux007) 回复于 2004-06-28 10:56:48 得分 0

关注Top

14 楼Jarrylogin(正经事情我不会,歪门邪道样样行) 回复于 2004-06-28 11:23:30 得分 0

void   tt(char   a[][20])或者   void   tt(char   (*a)[20])数组指针的形式Top

15 楼jaredcsdn(Jared) 回复于 2004-06-28 17:09:37 得分 0

要我说就不要挖空心思了  
   
  直接     void   tt(char   *str,   unsigned   n)       算了  
   
  用   *(str+i*n+j)   取值死不了人的.  
   
  说白了,   C在根本上就不支持二维数组,   楼主何必强求.Top

16 楼liu_feng_fly(笑看风云 搏击苍穹 衔日月) 回复于 2004-06-28 18:19:52 得分 0

使用STL啊,用vector  
 

posted on 2008-12-16 14:26 向左向右走 阅读(4183) 评论(3)  编辑 收藏 引用 所属分类: C/C++学习资料库

评论

# re: 请问如何把一个二维数组作为函数参数传进一个函数? 2008-12-22 16:40 WXB

void show(int width, int height, int *p);
void get(int width, int height, int *p);

int _tmain(int argc, _TCHAR* argv[])
{
const int W = 10;
const int H = 10;
int m[W][H];
get(W, H, &m[0][0]);
show(W, H, &m[0][0]);
return 0;
}

void show(int width, int height, int *p)
{
for (int i=0; i<width * height; i++)
{
cout<< p[i]
<< "\t";
}
}

void get(int width, int height, int *p)
{
for (int i=0; i<width * height; i++)
{
p[i] = i;
}
}  回复  更多评论   

# re: 请问如何把一个二维数组作为函数参数传进一个函数? 2009-06-02 23:53 fbi333444

你这样写是可以,可是我的数组里存放的汉字 这样一个字符一个字符的访问就不行了吧。  回复  更多评论   

# 请问如何解决“Command line error D2016 : '/Gi' and '/Z7' command-line options are incompatible”这个问题,谢谢。 2009-08-17 18:15 同路人

no  回复  更多评论   

只有注册用户登录后才能发表评论。