c - void *的双指针和单指针?

标签 c pointers

<分区>

我在读一本关于在 C 中实现 OOP 的书,发现了这段代码:

void delete (void * self)
{ 
    const struct Class ** cp = self;
    if (self && * cp && (* cp) -> dtor)
        self = (* cp) -> dtor(self);
    free(self);
}

我想知道为什么作者创建了双指针而不是单指针 像这样

void delete (void * self)
{ 
    const struct Class * cp = self;
    if (self && cp && cp -> dtor)
        self = cp -> dtor(self);
    free(self);
}

有什么区别吗?

最佳答案

在作者的对象系统中,每个对象结构都包含一个指向其类的指针作为其第一个元素:

typedef struct Object1 {
    Class *myclass;
    int data;
} Object1;

typedef struct Object2 {
    Class *myclass;
    double data;
} Object2;

这意味着通过将指向任何对象的 void * 指针视为 Class ** 指针,可以在不知道对象的实际类型的情况下跟踪类指针.这是标准允许的,因为:

6.7.2.1 Structure and union specifiers

15 [...] A pointer to a structure object, suitably converted, points to its initial member (or if that member is a bit-field, then to the unit in which it resides), and vice versa. [...]

因此任何指针 Object1 *Object2 * 等都可以转换为指向其第一个元素的指针,即 Class **(因为两者的第一个元素是 Class * 类型,指向第一个元素的指针是 Class ** 类型)。参见 In C, does a pointer to a structure always point to its first member?获取更多信息。

这是一种合法的方法,但有点难以遵循。等价于写

typedef struct BaseObject {
    Class *myclass;
} BaseObject;

并要求每个对象结构包含一个 BaseObject 实例作为其第一个成员; delete 函数然后将 self 转换为 BaseObject * 并写入 ((BaseObject *) self)->myclass->dtor:

void delete (void * self)
{ 
    BaseObject *base = self;
    if (self && base->myclass && base->myclass—>dtor)
        self = base->myclass->dtor(self);
    free(self);
}

关于c - void *的双指针和单指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12035832/

相关文章:

c - 如何在 C 中使用 select() 从客户端和 FIFO 读取()

c++ - 与枚举的隐式转换

发送指针时按引用调用 C

c - 指针不指向

C++ 多回调函数

c - 为什么移位的优先级低于 C 中的加法和减法?

c - printf 的正确用法是什么来显示用 0 填充的指针

c - 不正确的方法签名和调用

c - 为什么 C 程序将空行打印到文件?

c - 在 C 中使用 void 指针模拟通用链表