【发布时间】:2012-05-03 17:54:09
【问题描述】:
我正在学习 C,主要是通过 K&R,但现在我找到了面向对象的 C pdf 教程并且很着迷。我正在经历它,但我的 C 技能/知识可能无法胜任这项任务。 这是教程:http://www.planetpdf.com/codecuts/pdfs/ooc.pdf
我的问题来自于查看 pdf 前几章中的许多不同功能。下面是其中之一。 (pdf第14页)
void delete(void * self){
const struct Class ** cp = self;
if (self&&*cp&&(*cp)->dtor)
self = (*cp)->dtor(self);
free(self);
}
dtor 是一个析构函数指针。但是对于我的问题来说,这方面的知识并不是真正必要的。
- 我的第一个问题是,为什么 **cp 是常数?是否有必要或只是为了让代码编写者不会意外做出任何破坏性的事情?
- 其次,为什么 cp 是指向指针的指针(双星号?)。 struct 类在 pdf 的第 12 页上定义。我不明白为什么它不能是单个指针,因为我们似乎将 self 指针转换为 Class 指针。
- 第三,如何将 void 指针更改为类指针(或指向类指针的指针)?我觉得这个问题最能说明我对C的理解不足。我脑海中想象的是一个void指针占用了一定的内存,但它必须小于Class指针,因为一个Class有很多“东西”在里面。我知道 void 指针可以“强制转换”为另一种类型的指针,但我不明白如何,因为可能没有足够的内存来执行此操作。
提前致谢
【问题讨论】:
-
@Joe 绝对没有错。良好的 C 编程技能非常宝贵,在快速编写脚本的今天很难找到。
-
@Joe - 我认为这意味着 ANSI C89,较新的 K&R 书中讨论了它。示例中的代码不是 K&R C IIRC。
-
我正在阅读 K&R ANSI(我认为从 1989 年开始,如您所说。)代码示例来自 OOC pdf