免费注册 查看新帖 |

Chinaunix

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

[C] 请教:函数中指针的指针的传递的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-13 10:09 |只看该作者 |倒序浏览
#include <stdio.h>
#include <string.h>
void test1(char *t)
{
printf("%s\n",t);
}
void test2(char **t)
{
        printf("%s\n",t[0]);
}
int main()//测试例子,出错处理就不写了^_^
{
        int i=0,j=0;

        char t2[]="asdfasdf";
        char **t3;
        char t4[5][10]={"11111","22222","33333","44444"};
        t3=(char **)malloc(sizeof(char)*100);
        t3[0]="asfas";

        test1(t2);
        test1(t3[0]);
        test1(t4[0]);

        test2(t3);
        test2(t4);//这里会报段错误,不知道为什么 上面四个函数都可以正确执行
        

        free(t3);
        printf("end\n");
}

因为想传递一个字符串数组到一个函数中去使用字符串数组中的值, 采用的是 test2(t4)这句话这种形式,结果报段错误,于是写了上面的测试代码,哪位老兄解释 下为什么这样?
查书得到的结论是 函数参数为数组名时,形参和实参使用同一块内存地址,不知道为什么我用test2(t4)这种形式会报段错
我理解的一种解释是 t4的生存周期是在主函数中,到了test2函数中已不存在,所以报段错误;但是我测试中如test1函数用的一维数组确可以引用main函数中数组变量的值,所以比较困惑,他俩唯一的不同就是一是一维的 一个是二维的 ,还请各位指点下  多谢了

论坛徽章:
0
2 [报告]
发表于 2008-05-13 13:36 |只看该作者
概念问题, 字符串数组char a[][]和指针数组char *b[]不同的
字符串数组是二维字符数组, 指针数组是一维数组
通俗的说
a做参数, 退化二次,成一个指向字符的指针,相当于char* (不过好像标准里, 二维数组不能直接做参数)
b做参数, 退化一次, 成一个指向指针的指针,相当于char**

[ 本帖最后由 204tian 于 2008-5-13 13:40 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-05-13 14:02 |只看该作者

  1. 二维数组作实参,其形参应该如下形式:
  2. void test2(char (*t)[10])
  3. {
  4.         printf("%s\n",t[0]);
  5. }
复制代码
再不明白,可以看一下下面这篇文章
http://blog.chinaunix.net/u1/35100/showart_445864.html

[ 本帖最后由 ruoyisiyu 于 2008-5-13 14:38 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-05-13 15:05 |只看该作者
多谢楼上两位的指点
那我要传递的是一个二维字符串数组,并且数组长度不确定,即ruoyisiyu兄所写的void test2(char (*t)[10]) 中的10也是不确定的,
那这时有什么好的办法把一个二维字符数组传递到一个函数中去么

论坛徽章:
0
5 [报告]
发表于 2008-05-13 15:07 |只看该作者

回复 #4 stywt 的帖子

实参传个指针数组不满足要求么?

论坛徽章:
0
6 [报告]
发表于 2008-05-13 15:11 |只看该作者
字符串的个数也不一样,即指针数组的大小也是不一定的

论坛徽章:
0
7 [报告]
发表于 2008-05-13 15:17 |只看该作者
没法传,要么确定行, 要么确定列。  所以大家都用指针数组

论坛徽章:
0
8 [报告]
发表于 2008-05-13 15:30 |只看该作者
ok 我再想别的折,大不了放在一个字符串里,拿分隔符隔开 :wink:

论坛徽章:
0
9 [报告]
发表于 2008-05-13 15:33 |只看该作者
原帖由 stywt 于 2008-5-13 15:11 发表
字符串的个数也不一样,即指针数组的大小也是不一定的

  1. void f(char **p)
  2. {
  3. ......//ignore
  4. }
  5. char *a[]={"abc","de","fghi"}
  6. char *b[]={"lmn"};
  7. f(a);
  8. f(b);
复制代码

这样?

论坛徽章:
0
10 [报告]
发表于 2008-05-13 16:48 |只看该作者
这样可以。多谢
不过还是有点不明白为什么
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP