我在某处读过一个关于指向or的问题,并且对几种语言的保留字产生了疑问。void
void *
void
我有这个代码:
typedef enum VALUE_TYPE {
VT_INTEGER, VT_STRING, VT_BOOL, VT_NULL
} valuetype_t;
typedef struct VALUE {
void *iv;
valuetype_t tp;
} value_t;
但我不太明白void *
in 的用途是什么struct
。
据我了解,在c和c++中,类型void
就是一切,它什么都不是,但我不太清楚这是什么意思。
有人可以向我解释它是什么void
以及它在使用它的各种语言中的功能吗?
对于c和c++来说,它
void
实际上没有任何意义,但添加一个简单的星号(*
),它可以是一切,或者更确切地说,任何东西!从部分开始,保留字
void
在 C 中具有以下用例(其中包括):类型说明符:
上面是一个类型函数的声明
void
,即不返回某种类型的值,因此不能有一个类型的变量void
来分配函数的返回值:少得多:
如果您在第一段代码中注意到,我
(void)
在参数部分中使用了声明的方法使用的参数部分,这将在下面解释。功能密封剂。
默认情况下,C 函数在未明确放在函数定义1的括号之间时是可变参数:
void
但是,当我们
void
在括号之间使用时,上面的方法不起作用:删除...警告?
当存在可能导致软件中未指定行为的非致命问题时,抑制编译器抛出的警告绝不是一个好主意:
在这种情况下,它
(void)
用作转换或转换运算符......因为我们正在转换为空,该值是无用的。伙计!但是,有些编译器在使用强制转换时会抛出警告
void
。我们都期待……
void *
是什么,或者……我们是这么想的。是的
void
,伴随着*
, 是一种强大的数据类型,它存储指向任何其他现有数据类型的指针,实际上,它是保留内存的函数返回的内容:这是因为它
void *
是指向类型未知的内存地址的指针2,这就是您在问题中的代码中所做的,您定义一个类型字段void *
并通过另一个变量猜测它的值。我真的认为
void *
应该避免或仅在确切知道它指向的值时才使用它:事实上,我可以用那段记忆3做任何我想做的事:
在上面的示例中,我使用它来存储一个 1000 字节的动态分配的内存指针,但是由于我不知道如何处理这些字节,所以我使用它们来存储整数,同样,我可以将该指针转换为
void
指向char
并存储文本字符串的指针。但是当我们将指针从其他任何东西传递给类型参数时,还剩下什么
void *
?重要的是 C 有点宽容(我不希望它有孩子)并自动转换为void *
4以便被调用的函数可以使用作为参数传递的指针。指针
void
在明智的手中是一种非常强大的类型,但是,它可能会导致代码中的疏忽和问题,就像任何好的 C 实践一样,建议不要滥用这种类型。1 : Ideone来检查一下。
2:这并非完全没有听说过,但是 void 类型的指针只让我们知道它指向的地址,而不是它包含的数据。
3 : Ideone来检查一下。
4:所有指针大小相同,唯一不同的是根据运行环境解释内存地址的方式。