繁体   English   中英

空指针的目的是什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM