3 回答
TA贡献1812条经验 获得超5个赞
是否可以取消引用void指针而不用C编程语言进行类型转换...
否,void表示没有类型,您不能取消引用或分配给它。
有没有一种方法可以泛化一个可以接收指针并将其存储在void指针中的函数,通过使用该void指针,我们可以创建一个泛化的函数。
您不能仅仅以可移植的方式取消引用它,因为它可能未正确对齐。在像ARM这样的某些体系结构上,这可能是个问题,其中指向数据类型的指针必须在数据类型的大小的边界处对齐(例如,指向32位整数的指针必须在4字节边界处对齐才能取消引用)。
例如,uint16_t从阅读void*:
/* may receive wrong value if ptr is not 2-byte aligned */
uint16_t value = *(uint16_t*)ptr;
/* portable way of reading a little-endian value */
uint16_t value = *(uint8_t*)ptr
| ((*((uint8_t*)ptr+1))<<8);
另外,是否可以使用带空指针的指针算术...
void由于缺少指针下方的具体值以及大小,因此无法对指针进行算术运算。
void* p = ...
void *p2 = p + 1; /* what exactly is the size of void?? */
TA贡献1818条经验 获得超3个赞
在C语言中,void *无需显式转换即可将a转换为指向不同类型对象的指针:
void abc(void *a, int b)
{
int *test = a;
/* ... */
但是,这不利于以更通用的方式编写函数。
您不能通过void *将a 转换为其他指针类型来取消引用,因为取消引用指针会获得指向对象的值。裸名void不是有效类型,因此无法取消引用a void *。
指针算术是将指针值更改为sizeof所指向对象的倍数。同样,由于void不是真正的类型,sizeof(void)因此没有任何意义,因此指针算法在上无效void *。(某些实现允许使用,将等效指针算法用于char *。)
- 3 回答
- 0 关注
- 544 浏览
添加回答
举报