二维指针取值与一维指针的问题,求高手详解~

kangnux01 2012-02-08 09:29:39
/*scmp:string compare of *p1 and *p2 */
int scmp(const void *p1,const void *p2)
{
char *v1,*v2;
v1=*(char **)p1;/*这里是问题关键*/
v2=*(char **)p2;/*这里是问题关键*/
return strcmp(v1,v2);
}
这是一段代码,我的问题是:在第5 第6行,代码是先强制转换为二维指针,而后取值一维-----这样做的好处是什么,为什么不直接强制转换为一维赋值给v1 v2?
...全文
264 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
kangnux01 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 mingliang1212 的回复:]

我觉得这个是非常糟糕的设计,毫无好处。楼主可不用再问了。
[/Quote]
这句话霸气,直接把《程序设计实践》给否定了~
iamnobody 2012-02-08
  • 打赏
  • 举报
回复
我觉得这个是非常糟糕的设计,毫无好处。楼主可不用再问了。
IVERS0N 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 kangnux01 的回复:]

引用 13 楼 gdujian0119 的回复:

你修改的那两种方法我都懂,但是为什么你要推荐第一种?原因?
[/Quote]

你可以传引用和传指针的区别来理解 你的例子没必要用2级指针 假如你需要操作这个指针 又想影响到实参就选择2级指针
Minikinfish 2012-02-08
  • 打赏
  • 举报
回复
这个要看你是否需要修改p1以及p2的地址了。

就目前这个例子看,是没有必要使用二维指针,并且使用二维指针效率会下降一点点。。。

至于为什么要求这么做,我相信,是要求程序员养成地址参数传递的习惯,避免赋值参数传递时,没有将参数的修改反馈回来。记得C以及C++书中的两个整数交换的例子,书中已经讲得非常明白了。
kangnux01 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 gdujian0119 的回复:]
[/Quote]
你修改的那两种方法我都懂,但是为什么你要推荐第一种?原因?
孤独小剑 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 kangnux01 的回复:]

楼上各位,我错了,我的问题是:为啥用的是:
int r = scmp(&p1, &p2);
v1=*(char **)p1;
v2=*(char **)p2;
而不用:
int r = scmp(p1, p2);
char* p1 = "1";
char* p2 = "2";
刚刚我的追问果断2了一下,理解理解~
[/Quote]如果用scmp(p1, p2);假设p1="1111";那么函数中v1计算出来的值就不是"1111"的地址,而是"1111"本身,即31313131。
IVERS0N 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kangnux01 的回复:]

引用 10 楼 gdujian0119 的回复:

楼主目前的实现是错误的,有两种修改方案:C/C++ code
int scmp(const void *p1,const void *p2)
{
char *v1,*v2;
v1=(char *)p1;/*这里是问题关键*/
v2=(char *)p2;/*这里是问题关键*/
return strcmp(v1,v2);
}
……
[/Quote]
二级指针可以使指向改变 实参也改变

你这里没什么区别
kangnux01 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 gdujian0119 的回复:]

楼主目前的实现是错误的,有两种修改方案:C/C++ code
int scmp(const void *p1,const void *p2)
{
char *v1,*v2;
v1=(char *)p1;/*这里是问题关键*/
v2=(char *)p2;/*这里是问题关键*/
return strcmp(v1,v2);
}
调用方法为:char *p1;
char *p2;
………
[/Quote]
为什么推荐第一种?
孤独小剑 2012-02-08
  • 打赏
  • 举报
回复
楼主目前的实现是错误的,有两种修改方案:
int scmp(const void *p1,const void *p2)
{
char *v1,*v2;
v1=(char *)p1;/*这里是问题关键*/
v2=(char *)p2;/*这里是问题关键*/
return strcmp(v1,v2);
}
调用方法为:char *p1;
char *p2;
……;
scmp(p1, p2);
int scmp(const void **p1,const void **p2)
{
char *v1,*v2;
v1=*(char **)p1;/*这里是问题关键*/
v2=*(char **)p2;/*这里是问题关键*/
return strcmp(v1,v2);
}
调用方法为:char *p1;
char *p2;
……;
scmp(&p1, &p2);
推荐第一种;
kangnux01 2012-02-08
  • 打赏
  • 举报
回复
楼上各位,我错了,我的问题是:为啥用的是:
int r = scmp(&p1, &p2);
v1=*(char **)p1;
v2=*(char **)p2;
而不用:
int r = scmp(p1, p2);
char* p1 = "1";
char* p2 = "2";
刚刚我的追问果断2了一下,理解理解~
IVERS0N 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 minikinfish 的回复:]

char* p1 = "1";
char* p2 = "2";

int r = scmp(&p1, &p2);
以及
int r = scmp(p1, p2);

两种调用的区别。。。。。

很显然,你的函数实现属于前一种方案。
[/Quote]

++ 函数调用的实参不一样
Minikinfish 2012-02-08
  • 打赏
  • 举报
回复
char* p1 = "1";
char* p2 = "2";

int r = scmp(&p1, &p2);
以及
int r = scmp(p1, p2);

两种调用的区别。。。。。

很显然,你的函数实现属于前一种方案。
pengzhixi 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kangnux01 的回复:]
引用 1 楼 pengzhixi 的回复:

因为参数传递进来就是二级指针的。如果你传个char*作为参数那么这个函数就是一个错误的实现。

为什么说参数传递进来就是二级指针?不大明白~
[/Quote]
v1=*(char **)p1;
v2=*(char **)p2;
这两句就暴露出来了。
AnYidan 2012-02-08
  • 打赏
  • 举报
回复
为何不直接点
v1=(char *)p1;
v2=(char *)p2;
kangnux01 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]

因为参数传递进来就是二级指针的。如果你传个char*作为参数那么这个函数就是一个错误的实现。
[/Quote]
为什么说参数传递进来就是二级指针?不大明白~
kangnux01 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lile1234_show 的回复:]

C/C++ code

void*为无类型指针,可以指向任何数据类型,之后通过(char **)p1将void *p1和void *p2,
强制转换成类似成char *a[] = {"abc"}中a的这种类型,即p1是一个地址,
该地址里放的是地址,可以把p1也看成是char *p1[] = {"abc"},
那么*(char **)p1就是指向字符串“abc”,因为strcmp是对字符进行比……
[/Quote]
这个我明白,再看看问题吧~
lee_鹿游原 2012-02-08
  • 打赏
  • 举报
回复

void*为无类型指针,可以指向任何数据类型,之后通过(char **)p1将void *p1和void *p2,
强制转换成类似成char *a[] = {"abc"}中a的这种类型,即p1是一个地址,
该地址里放的是地址,可以把p1也看成是char *p1[] = {"abc"},
那么*(char **)p1就是指向字符串“abc”,因为strcmp是对字符进行比较,所以必须进行上述的转换。
pengzhixi 2012-02-08
  • 打赏
  • 举报
回复
因为参数传递进来就是二级指针的。如果你传个char*作为参数那么这个函数就是一个错误的实现。

69,381

社区成员

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

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