我正在看的书里有一个代码示例
int compare_parts (const void *p, const void *q)
{
struct part *p1 = p;
struct part *q1 = q;
此代码是 qsort 比较函数的一部分。书上说,由于 qsort 需要
void *
类型的参数,并且我们无法通过 void 指针访问零件编号,因此我们需要指向零件结构的指针。它表示,为了解决这个问题,我们将 compare_parts
将 p 和 q 分配给 struct part *
类型的变量,从而将它们转换为所需的类型。
这对我来说没有意义。在我看来,线
struct part *p1 = p
意味着 p1 指向 p。并且根据间接运算符的定义,p 必须指向 *p。因此,p1 指向 p 指向 *p。 struct part *p1 = p
告诉我们 p1 指向类型为 struct part
的对象,因此 p 必须具有类型 struct part
,因为 p1 指向 p。但如果 p 是一个指针,它怎么会有类型 struct part
呢?我希望它指向 struct part
类型的东西,但本身不具有这种类型。
struct part *p1 = p;
不包含作业 *p1 = p;
。在创建声明的初始语法之后,将初始化语法添加到 C 中。
在
struct part *p1 = p;
中,struct part *p1
声明 p1
是指向 struct part
的指针,并且 = p
表示用 p1
的值初始化 p
。
声明中的初始化始终仅初始化所声明的普通对象,
p1
,而不是可以与声明器中的其他部分形成的任何表达式。