猿问

C程序中void指针的概念

是否可以取消引用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,那将是有益的。


另外,使用空指针的指针算术是否可能?


慕莱坞森
浏览 545回答 3
3回答

慕雪6442864

是否可以取消引用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&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | ((*((uint8_t*)ptr+1))<<8);另外,是否可以使用带空指针的指针算术...void由于缺少指针下方的具体值以及大小,因此无法对指针进行算术运算。void* p = ...void *p2 = p + 1; /* what exactly is the size of void?? */

泛舟湖上清波郎朗

在C语言中,void *无需显式转换即可将a转换为指向不同类型对象的指针:void abc(void *a, int b){&nbsp; &nbsp; int *test = a;&nbsp; &nbsp; /* ... */但是,这不利于以更通用的方式编写函数。您不能通过void *将a 转换为其他指针类型来取消引用,因为取消引用指针会获得指向对象的值。裸名void不是有效类型,因此无法取消引用a void *。指针算术是将指针值更改为sizeof所指向对象的倍数。同样,由于void不是真正的类型,sizeof(void)因此没有任何意义,因此指针算法在上无效void *。(某些实现允许使用,将等效指针算法用于char *。)
随时随地看视频慕课网APP
我要回答