[英]What is the purpose of void pointers?
为什么需要 void 指针,只要可以将任何指针类型转换为任何指针类型,即:
char b = 5;
int*a = (int*)&b;//both upcasting
或者
int b = 10;
char*a = (char*)b;//and downcasting are allowed
?
另外,为什么在使用 malloc/calloc/realloc 时不需要强制转换?
可以将任何指针类型转换为任何指针类型
不完全的。 void *
被定义为将任何object 指针1转换为void *
并以等效值再次返回。 它不需要任何演员表。
在不太常见的架构中,一些其他指针的大小和范围可能小于void *
。 在其他指针类型之间进行转换可能会丢失必要的信息。
void *
提供了一个通用的object指针类型。
void *p = any_object_pointer; // No casts required
any_object_pointer = p; // No casts required
char *
可以替代void *
,除了与其他 object 指针之间的转换需要强制转换。
OP 的char b = 5; int*a = (int*)&b;
char b = 5; int*a = (int*)&b;
由于 alignment 对int *
的需求可能超过char *
,因此存在未定义行为的风险。
1 Function 指针可能比void*
更宽。 void *
和其他指针是object 指针。 C 缺少真正通用的指针类型。
void
指针对于创建通用 API 非常有用。 您可能会想到qsort
function 可用于对任何类型的 arrays 进行排序。 如果 API 不知道指针的具体类型,则可以使用void
指针。
void qsort(
void *base,
size_t number,
size_t width,
int (__cdecl *compare )(const void *, const void *)
);
关于分配函数,也是一样的。 C 运行时不知道有效 object 的类型。 但这不是问题,因为用户可以使用通用指针void
。
所以void
指针被认为是通用指针,对于多态非常有用,这就是为什么 C 语言使强制转换为void
是可选的。
“为什么需要 void 指针,只要可以转换任何指针类型”。
然后,分配 function 将不得不使用共同的分母,例如 char。 但是,如果必须转换为我们真正需要的任何东西,那将是令人困惑的。 “void”只是意味着“一堆字节”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.