请教char**的含义

akai_cn 2006-08-13 09:44:37
int CompStrLen(const void* a, const void* b)
{
if(strlen(*(char**)a)==strlen(*(char**)b))
return strcmp(*(char**)a, *(char**)b);
return strlen(*(char**)a) - strlen(*(char**)b);
}

不明白为什么强制转换用的是char** 而不是char*,char**代表什么含义?请教了。
...全文
296 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
akai_cn 2006-08-18
  • 打赏
  • 举报
回复
To kinglytt() :
一遍没看懂,我收藏反复看下。
AdenPlus 2006-08-17
  • 打赏
  • 举报
回复
不过C++里面有 const_cast<> 就不需要这么麻烦了!
AdenPlus 2006-08-17
  • 打赏
  • 举报
回复
楼上的牛叉!pf!
kinglytt 2006-08-17
  • 打赏
  • 举报
回复
一点错误都没有.这是C/C++使用指针的最高境界.(我经常用类似这个例子向自以为很懂指针的人说明到底什么才叫指针!)

其实是要把a 从const void*类型转换成char*类型.而直接做这样的转换是编译器所不能容忍的.你想想,把常量转成非常量编译器它能受得了吗?

并不是所有的数据类型都可以相互转换的,但是所有的指针类型都可以相互转换.

于是,我们把a的地址(注意,指针本身也是变量,也有自己的地址)取出来,假设叫p吧, 现在p是一个指向a的指针.其类型是void**.由于指针类型间的转换是编译器允许的(比如可以把char*转成int*),我们把它转成char**( (void*)* -> (char*)* ),也就是告诉编译器,现在p不是指向void*了,而是指向char*了.最后,我们把p解引用,得到了一个char*.

整个过程可以概括为:取地址,指针类型转换,解引用.
这种方法可以绕过编译器的检查,转换任意类型的数据.

除非写非常底层的库函数,否则不要这样使用.绕过编译器的检查会带来很多安全问题!这也是java不能直接用指针的根本原因.

在本例中,strlen()要求使用char*类型的参数,直接将const void*传给它编译器必然报错,不得已才用此方法的.
htqx 2006-08-14
  • 打赏
  • 举报
回复
*(char **) 这不是一个类型转换,而且是一个运算。执行了 *
char* 从类型上讲,他等同于上一个,但是没有执行运算。

triace_zhang 2006-08-14
  • 打赏
  • 举报
回复
这个函数写的很有问题,一般的一维指针做实参会出错。具体传进来的应该是个二维的char**指针才对。不过这样有多此一举了。楼主是怎么调用这个函数的?
guyes123 2006-08-14
  • 打赏
  • 举报
回复
我觉得是不是为了理解方便嘛.
* (char* * )
指向 char* 所指 的地方
akai_cn 2006-08-13
  • 打赏
  • 举报
回复
To xiangtongyuan:
改成strlen((char*)a是可以,不过我就是很费解strlen(*(char**)a)的含义。
akai_cn 2006-08-13
  • 打赏
  • 举报
回复
楼上各位,是int CompStrLen(const void* a, const void* b)没错的
所以我觉得很费解,恳请指教。
xiantongyuan 2006-08-13
  • 打赏
  • 举报
回复
为什么要那么麻烦,直接用下面的就行了呀!
int CompStrLen(const void* a, const void* b)
{
if(strlen((char*)a)==strlen((char*)b))
return strcmp((char*)a, (char*)b);
return strlen((char*)a) - strlen((char*)b);
}
lj860603 2006-08-13
  • 打赏
  • 举报
回复
应该用 const void** a, const void** b 吧。
改为这样的话,下面的代码都很平常了——用char** 而不可以用char *
lj860603 2006-08-13
  • 打赏
  • 举报
回复
这里是不是有问题:
const void* a, const void* b
===========>
const void** a, const void** b //2级指针才对吧

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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