在C编程语言中,有没有可能在不进行类型转换的情况下取消引用空指针?
另外,有没有什么方法可以泛化一个函数,它可以接收一个指针,并将它存储在一个空指针中,通过使用这个空指针,我们可以生成一个广义函数吗?
例如:
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将是有益的。
另外,使用空指针的指针算术可能吗?
发布于 2009-03-28 10:42:39
在C中,void *
可以转换为指向不同类型对象的指针,而无需显式强制转换:
void abc(void *a, int b)
{
int *test = a;
/* ... */
不过,这对以更通用的方式编写函数没有帮助。
您不能通过将void *
转换为不同的指针类型来取消对它的引用,因为取消对指针的引用就是获得指向的对象的值。裸void
不是有效类型,因此无法取消对void *
的引用。
指针算法是关于通过指向对象的sizeof
的倍数来改变指针值。同样,因为void
不是true类型,所以sizeof(void)
没有意义,所以指针算法在void *
上是无效的。(有些实现允许这样做,对char *
使用等效的指针算法。)
发布于 2009-06-04 07:43:13
您应该知道,与Java或C#不同的是,在C中,绝对不可能成功地“猜测”void*
指针所指向的对象类型。类似于getClass()
的东西根本不存在,因为这些信息无处可寻。因此,您要寻找的那种“泛型”总是带有显式的元信息,比如示例中的int b
或printf
函数家族中的格式字符串。
发布于 2010-10-22 23:25:28
空指针称为泛型指针,它可以引用任何数据类型的变量。
https://stackoverflow.com/questions/692564
复制相似问题