为了账号安全,请及时绑定邮箱和手机立即绑定

C程序中void指针的概念

C程序中void指针的概念

C
慕莱坞森 2019-12-07 16:49:56
是否可以取消引用void指针而无需使用C编程语言进行类型转换?另外,有没有一种方法可以泛化一个可以接收指针并将其存储在void指针中的函数,并且通过使用该void指针,我们可以制作一个泛化的函数吗?例如:void abc(void *a, int b){   if(b==1)      printf("%d",*(int*)a);     // If integer pointer is received   else if(b==2)      printf("%c",*(char*)a);     // If character pointer is received   else if(b==3)      printf("%f",*(float*)a);     // If float pointer is received}我想使此函数通用而不使用if-else语句-这可能吗?另外,如果有很好的互联网文章解释了空指针的概念,那么如果您提供URL,那将是有益的。另外,使用空指针的指针算术是否可能?
查看完整描述

3 回答

?
慕雪6442864

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?? */


查看完整回答
反对 回复 2019-12-07
?
泛舟湖上清波郎朗

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 *。)


查看完整回答
反对 回复 2019-12-07
  • 3 回答
  • 0 关注
  • 544 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信