免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9257 | 回复: 13
打印 上一主题 下一主题

[函数] 二维数组做函数参数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-01-11 10:15 |只看该作者 |倒序浏览
二维数组定义如下:
char sToken[50][128];
函数中这样调用myfunc(sToken);
函数这样定义:
void myfunc(sToken)
char * sToken[];
{
   printf("%s\n",sToken[0]);
}
结果在printf那里出错,到底是哪错了?我这样写的格式为什么不对?因为我可以做到如下功能:
char * ary[]={"123","45"};
printf("%s",ary[0]);
但为什么函数调用就出错?

论坛徽章:
0
2 [报告]
发表于 2005-01-11 10:24 |只看该作者

二维数组做函数参数的问题

你的myfunc的原型怎么写的啊,void myfunc(char** identifier);

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2005-01-11 10:26 |只看该作者

二维数组做函数参数的问题

最好这样。
void myfunc(char sToken[][100]) ;



void myfunc(char (*sToken)[100])

论坛徽章:
0
4 [报告]
发表于 2005-01-11 10:43 |只看该作者

二维数组做函数参数的问题

我不是写了吗,myfunc的原型如下:
void myfunc(sToken)
char * sToken[];
{
printf("%s\n",sToken[0]);
}
另外,我不希望在函数中硬性指定数组大小。因为这里的myfunc()只是个简化版本,其实它要根据传进来的其他参数做许多事。我想知道,若用char * sToken[]这样的形式,如何访问到数组中的某个字符串?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2005-01-11 10:59 |只看该作者

二维数组做函数参数的问题

那你就不要这样定义你的数组。
char sToken[50][128];

换成

char * sToken[50];
以后动态malloc分配空间赋值给sToken。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2005-01-11 11:04 |只看该作者

二维数组做函数参数的问题

C语言中,对多维数组的传递,有些捉襟见肘。这是由于C的低级性导致的。理解了数组名、地址、指针的概念以及C是怎么样实现的时候,就能明白了。^_^,这还真是C中的难点。

这些东西在《C专家编程》中有非常详细的说明。

问题是这样的:

实参:你传递给参数的实参是一个二维数组的数组名,也就是二维数组的首地址。
形参:是一个指针的指针。

<查阅一下用数组名定位数组元素和用指针定位元素的不同>;

为了说明问题,不妨把你的形参重新定义成s。所以,在函数的内部,把s处理成指针(注意,不是数组名了!问题就出在这里)。因为s是指针(一个指针的指针)了,所以s就被解释为*(s+i)。看到了吗?这里,函数就无法“正确”(指和我们头脑想的一样)确定步长了。因为s是指针的指针,所以,i的步长被解释为一个指针的大小,自然和你的二维数组的一维大小是不一样的了。这是第一个错误的原因。

第二个错误的原因是因为编译器处理指针和处理数组存在本质的区别。看看我的例子程序,对于数组,data+1和*(data+1)的值是一样的,而对于指针,就严格的“指”过去了。这是因为,数组名,不过是个名字,是个地址。而指针则是个变量。这个在《C专家编程》中有详述,我就不多说了。例子如下:

  1. [yangwl:/home/users50/yangwl/test/data]$ cat test.c
  2. #include <stdio.h>;
  3. #include <stdlib.h>;

  4. void fun(char **data);

  5. int main(void)
  6. {
  7.         char    data[2][5];
  8.         printf("in main\n");
  9.         printf("data:%p\n", data);
  10.         printf("*data:%p\n", *data);
  11.         printf("data+1:%p\n", data+1);
  12.         printf("*(data+1):%p\n", *(data+1));
  13.         printf("data[1]:%p\n", data[1]);
  14.         printf("&data[1][3]:%p\n", &data[1][3]);

  15.         fun(data);
  16.         exit(0);
  17. }

  18. void fun(char **data)
  19. {
  20.         printf("in fun\n");
  21.         printf("data:%p\n", data);
  22.         printf("*data:%p\n", *data);
  23.         printf("data+1:%p\n", data+1);
  24.         printf("*(data+1):%p\n", *(data+1));
  25.         printf("data[1]:%p\n", data[1]);
  26.         printf("&data[1][3]:%p\n", &data[1][3]);
  27.         return ;
  28. }
  29. [yangwl:/home/users50/yangwl/test/data]$ gcc test.c
  30. test.c: In function `main':
  31. test.c:17: warning: passing arg 1 of `fun' from incompatible pointer type
  32. [yangwl:/home/users50/yangwl/test/data]$ ./a.out
  33. in main
  34. data:0xbffffbd0
  35. *data:0xbffffbd0
  36. data+1:0xbffffbd5
  37. *(data+1):0xbffffbd5
  38. data[1]:0xbffffbd5
  39. &data[1][3]:0xbffffbd8
  40. in fun
  41. data:0xbffffbd0
  42. *data:0x4212aa58
  43. data+1:0xbffffbd4
  44. *(data+1):0x4212a2d0
  45. data[1]:0x4212a2d0
  46. &data[1][3]:0x4212a2d3
  47. [yangwl:/home/users50/yangwl/test/data]$  
复制代码


所以,用到传递参数的时候,尽量不要传递多维数组。需要传递的时候(一般也就是字符串数组),建立一个指针数组对应,然后传递。对于整“块”的多维数组,谨慎的使用全局量好了。

论坛徽章:
0
7 [报告]
发表于 2005-01-11 12:23 |只看该作者

二维数组做函数参数的问题

[quote]原帖由 "jchc"]为什么函数调用就出错?[/quote 发表:


char * ary[]={"123","45"};

这个是一维数组。

论坛徽章:
0
8 [报告]
发表于 2005-01-11 15:19 |只看该作者

二维数组做函数参数的问题

实参:你传递给参数的实参是一个二维数组的数组名,也就是二维数组的首地址。
形参:是一个指针的指针。


是不是怎么传都是个指针的值,而无法传递整个数组?有没有办法以一个数组作为参数呢?

感觉楼主的那种方式并不能起到
可变长度数组作为参数
的目的,他那种参数到底是什么呢?


  1. char * xxx[]= {"124", "234"}
复制代码

应该是一个指针数组, xxx[0]是第一个字符串"123"的指针,printf当然不会出错了!

aero请详细解释一下楼主这种传递参数的方式到底是怎么个回事, 不懂

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2005-01-11 15:27 |只看该作者

二维数组做函数参数的问题

^_^,偶也是理解了好长时间呢。《C专家编程》上面专门有一章讲这个问题。偶看人家讲的挺好的。我也不能表述的更清楚。还是去看看书吧,呵呵,这书写的真的很不错。

总之就是:数组无法作为参数,总会被编译器将地址赋值给形参指针的,即使指针定义成数组形式,也还是指针。然后各种差别都是由数组和指针不同的定位元素的方式导致的。

初学的时候,总是听说,数组和指针是一回事。而学到细节,就一定要再次区分开数组和指针了。偶觉得,数组和指针这两个概念从分到合再到分的过程就是一个进步的过程。

论坛徽章:
0
10 [报告]
发表于 2005-01-11 15:45 |只看该作者

二维数组做函数参数的问题

  1. 最好这样。
  2. void myfunc(char sToken[][100]) ;



  3. void myfunc(char (*sToken)[100])
复制代码

不要误导了好不好?这样定义有什么意义吗???
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP