3

以下代码来自The Practice of Programming

int scmp(const void *p1, const void *p2)
{
    char *v1, *v2;
    v1 = *(char **) p1;
    v2 = *(char **) p2;
    return strcmp(v1, v2);
}

我不明白为什么要使用表达式*(char **) p1。我们可以(char *)p1改用吗?它们之间有什么区别?

谢谢!

4

4 回答 4

5

没有。这(char **)是一个类型转换,并且转换*之前的一元解引用指针。如果你简单地取v1 = (char *) p1,那么v1将被设置为等于p1,当你想要的是v1等于 的char*时候p1

于 2012-11-21T06:52:50.967 回答
3

一个例子可以帮助你理解

让有字符串"yourString1""yourString2"

lets1是指向“yourString1”s2的指针,是指向“yourString2”的指针

s1->"yourString1"
s2->"yourString2"

调用scmp(s1,s2);原因p1指向s1p2指向s2

p1->s1->"yourString1"
p2->s2->"yourString2"

所以, p1,p2这里是双指针..

由于p1,p2是一个 void 指针,因此必须将其转换为char pointer.

所以,

(char**)p1将使 p1 成为 char 双指针

*(char**)p1and*(char**)p2现在将指向s1and s2

这将允许 strcmp 比较字符串s1s2

于 2012-11-21T07:02:14.290 回答
2

此函数中的界面设计得比最初看起来要复杂一些。可以将 scmp 设计为只使用指向字符串的指针(顺便说一句,这就是strcmp所做的)。

int scmp1(void * p1, void *p2) { return strcmp((char*)p1,(char*)p2);}
char *ptr = "bar";
char *ptr2 = "foo";

scmp1(ptr, ptr2); // this would make sense, however, 

scmp(&ptr, &ptr2); // this is how the interface is designed.

比较函数没有明显的原因采用指向(指向字符串的指针)的指针。也许该函数将在后续章节中扩展为交换函数内部的指针——然后调用者会看到 ptr 指向“foo”,而 ptr2 指向“bar”。(这在 scmp1 aka strcmp 类型函数中是不可能的,其中要传递的指针可以在本地修改,即分别在 scmp1 和 strcmp 函数中,但不会将更改传播给调用者)

于 2012-11-21T07:04:35.203 回答
2

(char**)p1表示p1是指向 char*(char*) 的指针(第二个 * 显示)。
所以得到 value *(char**)p1,结果是char(我们可以说是一个字符串)*,可以赋值给 v1(type is char *)。
void * 可以转换为任何指针*(char*,int*,double*)...*

于 2012-11-21T09:33:01.523 回答