[skill][c] *(char**)

/* 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);
}

qsort passes to the comparing function a pointer to the elements it has to compare; since in C there are no templates, this pointer is just brutally cast to a const void * (void * in C just means "this is some kind of pointer", and to do something on it you must cast it back to its actual type).

Now, if you are sorting an array of strings, each element you have to compare is a char *; but qsort passes to the comparison function a pointer to each element, so what your scmp receives is actually a char ** (a pointer to a pointer to the first character of the string), casted to a const void * because the signature of the comparison function says so.

So, to get your char *, you have first to convert the parameters to their actual type (char **), and then dereference this pointer to get the actual char * you want to compare.

(although, it would be more correct from a const-correctness point of view to cast to const char **)

http://stackoverflow.com/questions/10364153/pointer-cast-for-use-with-qsort

http://stackoverflow.com/questions/13487821/the-use-of-char/13487867

时间: 2024-12-27 00:13:08

[skill][c] *(char**)的相关文章

ER 和 数据库关系模式

http://lianghuanyue123.blog.163.com/blog/static/130423244201162011850600/ 我们眼下所接触的数据库基本上是关系数据库,关系数据库中的关系模式是型,而关系是值.关系模式是对关系的描写叙述. 什么是关系?关系实质上是一张二维表,当中每一行是一个元组,每一列是一个属性,每一个元组是该关系涉及到属性集合笛卡尔积的一个元素.(笛卡尔积是这种一个集合.集合中的元素是有序对,若A={0,1}B={a,b}则:A*B={<0,a>,<

CF 45C Dancing Lessons(优先队列)

http://codeforces.com/problemset/problem/45/C A - Dancing Lessons Time Limit:2000MS    Memory Limit:262144KB    64bit IO Format:%I64d & %I64u SubmitStatusPracticeCodeForces 45C Description There are n people taking dancing lessons. Every person is ch

C++ String 及其与char[]的比较

在学习C++之前  一般都是学过了C语言了 在C语言中   我们对字符串进行保存操作  使用的是char[] 但是在C++中    string比char[]的使用更为频繁  常见    下面稍微讲一下我对于string的认知 1.与其他的标准库类型一样   用户程序需要使用String类型对象  就必须包含相关的头文件   (为了编写方便   需要提供合适的using声明) #include <string> using std::string; 2.string对象的定义与初始化 stri

string8 string16 char*

jstring ifaceStr, jstring opPackageNameStr String16(opPackageName.c_str()),client, String8(iface.c_str()) 2.  String16 name16 = String16("HellOThEWrolD"); String8 name8 = String8(name16); 3.  string8 -> char* String8& initParam  initParam

C/C++中各种类型int、long、double、char表示范围(最大最小值)(转)

1 #include<iostream> 2 #include<string> 3 #include <limits> 4 using namespace std; 5 6 int main() 7 { 8 cout << "type: \t\t" << "************size**************"<< endl; 9 cout << "bool: \t

SQL Server再学习(1)——varchar、nvarchar、char的区别

SQL Server不能丢,复习一下: varchar(n) 长度为 n 个字节的可变长度且非 Unicode 的字符数据.n 必须是一个介于 1 和 8,000 之间的数值.存储大小为输入数据的字节的实际长度,而不是 n 个字节. nvarchar(n) 包含 n 个字符的可变长度 Unicode 字符数据.n 的值必须介于 1 与 4,000 之间.字节的存储大小是所输入字符个数的两倍. 两字段分别有字段值:我和coffee 那么varchar字段占2×2+6=10个字节的存储空间,而nva

char *与char []深度刨析

编译不能通过 #include "iostream" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { char *p= "hello" ; //不是把一个字符串赋给了一个字符型的指针,而是把一个字符型的指针指向了字符串的首地址. strcpy(p,"hel"); cout << p << endl; return 0; }//编译通不过 解析:char

C++ String 转 char*

最近一直用惯了C#,陡然间改回C++都有些不习惯了!吐槽一下,C#太方便了!!! 言归正传,C++里有些时候会用到String转char*这个功能,于是进来搜到了一些方法: 如果你申请了这样一个字符串:string str = "This is a test!",那么: 1.str.data()可以返回该字符串对应的char *,如char *p = str.data(); 2.str.c_str()也可以返回该字符串对应的char *,如char *p = str.data(); 3

getDat(char *val)获得某一天是这一年中的第几天

获得某一天是这一年中的第几天如:./g 20117/2/132 #include <time.h>#include <string.h>#include <stdio.h> const char SPLIT1[2]="-";const char SPLIT2[2]="/";const char SPLIT3[2]=" "; int getDay(char * val); int main(int argc,ch