我正试图了解 avoid*
以及它的适当用途以及是否有任何潜在的滥用用途我应该知道。(意思很酷,没有错)。
我不明白如何以及为什么要使用void*
. 如果我理解的话,我需要将当前指针转换为 a void*
,然后在我想使用它时再转换回原来的指针......?
为什么这是有益的?不要让事情变得通用,因为我需要知道void*
传递了什么类型来进行演员表......
谁能帮我理解void*
在Cvoid *
中,用于创建泛型集合是相当普遍的。例如,如果您想要一个通用链表,您可能会编写如下内容:
typedef struct node {
void *data;
struct node *next;
} node;
然后你可以创建一个 的链表foo
,另一个 的链表bar
,依此类推。
然而,在 C++ 中,这很少有用。在典型情况下,您可能希望将等效代码编写为模板:
template <typename T>
class node {
T data;
node *next;
};
使用较旧的编译器,您可以通过结合这两种技术来减少生成的代码。在这种情况下,您将使用一组指向 void 的指针来存储数据,然后拥有一个模板前端,该前端仅处理存储数据时的转换,以及T *
检索数据时的转换。void *
void *
T *
编译器/链接器的改进已经使这种技术(几乎?)完全过时了。较旧的编译器会为您实例化模板的每种类型生成单独的代码,即使实例化类型无关紧要。当前的编译器(或工具链,无论如何——其中相当一部分实际上是由链接器处理的)识别相同的代码序列,并自动将它们合并在一起。
底线:除非您需要 C 兼容性,或者您正在编写替换operator new
/ operator delete
,否则在编写void *
良好的 C++ 中使用通常很少见。
void*
是没有类型的内存地址。当它周围的代码有其他方式知道它正在使用什么类型时(例如,memchr
除了地址之外还需要传递内存区域的大小)时,它很有用。