如何在需要某种类型参数并使用指针的函数中将参数转换为所需类型

问题描述 投票:0回答:1

我正在看的书里有一个代码示例

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
类型的东西,但本身不具有这种类型。

c pointers
1个回答
0
投票

struct part *p1 = p;
不包含作业
*p1 = p;
。在创建声明的初始语法之后,将初始化语法添加到 C 中。

struct part *p1 = p;
中,
struct part *p1
声明
p1
是指向
struct part
的指针,并且
= p
表示用
p1
的值初始化
p

声明中的初始化始终仅初始化所声明的普通对象,

p1
,而不是可以与声明器中的其他部分形成的任何表达式。

© www.soinside.com 2019 - 2024. All rights reserved.