社区
C++ 语言
帖子详情
请教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
打赏
收藏
请教char**的含义
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**代表什么含义?请教了。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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级指针才对吧
char
**的
含义
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); } 不明白为什...
※【C】设计指针函数完成字符串的相加
设计一个函数指针,完成字符串的相加并返回相加后字符串的地址 方式一(不推荐,总是会忘记free掉内存): #include<stdio.h> #include<stdlib.h> #include<string.h>
char
* catstr(
char
* s1,
char
* s2); int main(){
char
s1[] = "123456";
char
s2[] = "67890";
char
*str = NULL;
请教
一下c语言的一个问题
char
* str = "Hello world!\n"; void print() { asm("movl $13,%%edx \n\t" "movl %0,%%ecx \n\t" "movl $0,%%ebx \n\t" "movl $4,%%eax \n\t" ::"r"(str):"edx","ecx","ebx"); } 其中第9行的::和:分别有什么
含义
,为什么要...
对有关数据类型转换的整理
[Z]对有关数据类型转换的整理 int i = 100; long l = 2001; float f=300.2; double d=12345.119;
char
username[]="fsdfaffasf";
char
temp[200]; cha
C++数据类型转换
int i = 100; long l = 2001; float f=300.2; double d=12345.119;
char
username[]="lanshuimei";
char
temp[200];
char
*buf; CString str; _variant_t v1; _bstr_t v2; 一、其它数据类型转换为字符串 · 短整
C++ 语言
64,683
社区成员
250,490
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章