【发布时间】:2023-04-09 15:49:01
【问题描述】:
这是代码的上下文:
void THREAD_CC server_thread(void *arg)
{
BIO *client = (BIO *)arg;
...
}
表达式(BIO *)arg 是否将void 指针arg 转换为指向BIO 的指针?我不确定我是否做对了。
任何帮助将不胜感激!
禅宗
【问题讨论】:
标签: c pointers void-pointers
这是代码的上下文:
void THREAD_CC server_thread(void *arg)
{
BIO *client = (BIO *)arg;
...
}
表达式(BIO *)arg 是否将void 指针arg 转换为指向BIO 的指针?我不确定我是否做对了。
任何帮助将不胜感激!
禅宗
【问题讨论】:
标签: c pointers void-pointers
这叫做演员表;它不会转换指针,它会说服编译器相信传入的指针(无类型)实际上是指向 BIO 的指针,并将其视为 BIO。
【讨论】:
void * 指针和BIO * 指针有不同的表示,它会将前者变为后者。这相当于将int 转换为long - 当然,在一些 系统上它可能是无操作的,但通常不是。
void * 和char * 必须相同,所有指向struct 的指针必须相同。例如,这允许实现使用在取消引用时检查的类型信息来标记指针类型。
double 必须是 8 字节对齐的机器可能会合理地使用指针值的 lower N-3 位来寻址内存中的 double s - 在这样的机器上,将 @ 987654331@ 与void * 之间需要换班。
是的。 (BIO *) casts void * 指针 (arg) 的类型为 BIO *
【讨论】:
它将 void* 转换(转换)为 BIO* 类型的指针。它并不“指向” BIO。
【讨论】:
您的输入变量 arg 是 void 类型。 Typecasting 只是将一种类型的变量转换为另一种类型。当您将指针作为参数传递给不同的函数并在取消引用它们时将它们类型转换为它们的原始类型时,这很有用。
在上述情况下,您将 arg 从 (void *) 类型转换为 (BIO *) 类型。现在您可以像访问普通 BIO * 指针类型一样访问 ponter client 的成员。
【讨论】: