以下代码来自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**)p1
and*(char**)p2
现在将指向s1
and 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*)...*