C语言:strcmp(*(char**)a,*(char**)b))

qsort中
字符串数组排序strcmp(*(char**)a,*(char**)b))
字符串数组排序strcmp((char*)a,(char*)b))
对一个字符数组return(*(char *)a-*(char *)b)
各程序的意思,具体一点
*(char**)a,*(char *)a,(char*)a的意思具体一点

*(char**)a
这个语句的执行顺序是
1.(char**)a 将变量a强制转换成char类型的指向指针的指针
2.对1算出来的地址解引用

其实对strcmp的形参做这些操作的目的只有一个,就是转换成char *类型,再传入。

这里a是一个指针,指向的地方又是一个指针(即a是指向指针的指针),a指向的那个指针所指向的地方才是存放我们真正想要的值

具体的说:
假设a这个变量的值是0x1234,由于a是个指针0x1234表示的当然是个地址,
如果对a变量解引用一次,就是到0x1234这个地址上去看看,假设看到的值是0x2345,
由于a是个指向指针的指针,即指向的地方存的还是个指针,就是0x1234这个地方存放的值0x2345还是个地址,这个地址0x2345就是一个字符串或者字符数组的首地址,起类型是char * 所以就可以作为strcmp的形参了

至于strcmp((char*)a,(char*)b))和strcmp(*(char**)a,*(char**)b))
的差别在于strcmp((char*)a,(char*)b))中的a和b已经是某种类型的指针(不是指针的指针)了,就无需先强制转换成char **了,只需要转换成char * 就可以了

最后一个:
return(*(char *)a-*(char *)b),是把指针a和b转换成char * 然后解引用一次后就得到了指针所指向的字符了,返回的值是两个字符的ASCII值的差值

关于强制类型转换
char (var1) 和int(var1)区别:
char (var1)告诉编译器把var1变量所在的内存的字节序列,每次一起解释1个字节(char是单字节类型的)
int(var1)告诉编译器把var1变量所在的内存的字节序列,每次一起解释4个字节,即每次取4个字节的内存解释为一个int(int是4字节类型的,有的环境中是2字节的,就一次解释2个字节)
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-11-13
qsort只是为你提供给它的一组结构数据调用你指定的回调函数进行排序
这时qsort的原型:
void qsort(void * Base,size_t NumOfElements,
size_t SizeOfElements, int (__cdecl * PtFuncCompare)(const void *, const void *));
Base是排序的数据的基地址,NumOfElements是排序的数据的数量,SizeOfElements是一个元素的大小,PtFuncCompare是回调函数指针。
通常的strcmp不能作为qsort的参数因为strcmp比较的是字符,而qsort欲比较的是字符串,qsort会把char**传给PtFuncCompare,而如果将strcmp传给PtFuncCompare的话将导致参数类型不符。

故回调函数需自己编写。例如
int mystrcmp(const void *str1, const void *str2){
return(strcmp(* (char * const *)str1, * (char * const *)str2));
}

然后这样调用qsort:
char *strings[MAXNUMS];
/*赋值*/
qsort(strings, MAXNUMS, sizeof(char *),mystrcmp);

注意,在此例中qsort只是交换strings数组中各元素的位置

如果你看不懂语法的话,Hi我
第2个回答  2009-11-13
1.a中存放的指针所指向的字符串与b中存放的指针所指向的字符串进行比较
2。a指向的字符串与b指向的字符串比较
3。 a指向的字符与b指向的字符比较

C语言:strcmp(*(char**)a,*(char**)b))
至于strcmp((char*)a,(char*)b))和strcmp(*(char**)a,*(char**)b))的差别在于strcmp((char*)a,(char*)b))中的a和b已经是某种类型的指针(不是指针的指针)了,就无需先强制转换成char **了,只需要转换成char * 就可以了 最后一个:return(*(char *)a-*(char *)b),是把指针a...

strcmp怎么用在字符串上?
可以使用库函数strcmp判断,具体如下:strcmp是C语言比较字符串的库函数,形式为int strcmp(char *a, char *b);该函数会对a和b的每个字符,按照ascii码值比较,如果二者完全相同返回0;如果a的ascii码值先出现较大者,会返回1;否则返回-1。所以,要判断字符串相等,可以使用。

如何判断字符串是否相等
可以使用库函数strcmp判断:strcmp是C语言比较字符串的库函数,形式为int strcmp(char *a, char *b);该函数会对a和b的每个字符,按照ascii码值比较,如果二者完全相同返回0;如果a的ascii码值先出现较大者,会返回1;否则返回-1。所以,要判断字符串相等,可以使用。"); else printf("str_1 is ...

c语言字符串比较函数strcmp是什么意思
C语言字符串比较函数strcmp是用于比较两个字符串的。详细解释如下:一、基本概念 在C语言中,strcmp函数是字符串比较的标准函数。它的主要作用是比较两个字符串。这个函数位于string.h头文件中,是C标准库的一部分。二、函数原型及参数 strcmp函数的原型为:c int strcmp;其中,str1和str2是需要比较的...

c 语言 strcmp
改后的程序 include<stdio.h> include<string.h> include<stdlib.h> main(){ int x;do { char a[50],b[50];gets(a);gets(b);if(strcmp(a,b)>0)printf("a>b");else if(strcmp(a,b)<0)printf("a<b");else if(strcmp(a,b)==0)printf("a==b");system("pause");}while(...

C语言这段strcmp代码是什么意思
char a[20], b[20]; strcmp(a,b)是比较ab两个字符串的大小 如果strcmp(a,b)==0,说明ab字符串相等 如果strcmp(a,b)>0,说明a字符串大于b字符串,也就是a的字母顺序应该在b后面 ---比如"abcd">"aabc", "bcde">"abcd" 如果strcmp(a,b)

C语言: strcmp的用法,char a[].char b[]
相等返回0,int a[]="a";int b[] = "b";strcmp(a,b)返回一个小于零的数,int a[]="b";int b[] = "a";strcmp(a,b)返回一个大于零的数,

c语言中 !strcmp(a,b)是什么意思?注意有个感叹号!
strcmp是个比较函数,用法就是a>b返回1,a<b返回-1,a==b返回0.C语言规定非0为真,0为假。!号是取非,即把0变成1,非0变成0;假设a=5,b=4 那么a>b,返回结果为1,取非之后为0,既为假.就不会执行下面的break语句。假设a=4,b=5 结果为a<b,返回值为-1,取非之后也是0,还是假...

C语言程序 用指针实现字符串比较函数strcmp
还是你两个字符串的分隔?所以当你输入abc,abc的时候计算识别你的第一个字符串是abc,abc 第二个字符串为\\n 所以你这里得到的始终是1 至于解决的办法:让计算机识别你的分隔符号 那方法就很多了,比如 scanf("%s%s",a,b);输入的时候用空白符(空格,tab,回车键)相间隔 ...

c语言strcmp函数
strcmp返回的实际上是两个字符串中第一个不同的字符的ASCII码的差,差大于0说明是>关系,小于0则是<关系.6>0,和1一样是表示大于,而且返回ASCII码的确切差值,可以方便用来实现一些其他的应用,比只知道大于带来了更多的信息

相似回答