以下代码来自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改用吗?它们之间有什么区别?
谢谢!
以下代码来自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改用吗?它们之间有什么区别?
谢谢!
没有。这(char **)是一个类型转换,并且转换*之前的一元解引用指针。如果你简单地取v1 = (char *) p1,那么v1将被设置为等于p1,当你想要的是v1等于 的char*时候p1。
让有字符串"yourString1"和"yourString2"。
lets1是指向“yourString1”s2的指针,是指向“yourString2”的指针
s1->"yourString1"
s2->"yourString2"
调用scmp(s1,s2);原因p1指向s1和 p2指向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 比较字符串s1和s2
此函数中的界面设计得比最初看起来要复杂一些。可以将 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 函数中,但不会将更改传播给调用者)
(char**)p1表示p1是指向 char*(char*) 的指针(第二个 * 显示)。
所以得到 value *(char**)p1,结果是char(我们可以说是一个字符串)*,可以赋值给 v1(type is char *)。
void * 可以转换为任何指针*(char*,int*,double*)...*