首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C程序设计中的空指针概念

C程序设计中的空指针概念
EN

Stack Overflow用户
提问于 2009-03-28 10:33:44
回答 12查看 211.3K关注 0票数 132

在C编程语言中,有没有可能在不进行类型转换的情况下取消引用空指针?

另外,有没有什么方法可以泛化一个函数,它可以接收一个指针,并将它存储在一个空指针中,通过使用这个空指针,我们可以生成一个广义函数吗?

例如:

代码语言:javascript
复制
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将是有益的。

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

EN

回答 12

Stack Overflow用户

发布于 2009-03-28 10:42:39

在C中,void *可以转换为指向不同类型对象的指针,而无需显式强制转换:

代码语言:javascript
复制
void abc(void *a, int b)
{
    int *test = a;
    /* ... */

不过,这对以更通用的方式编写函数没有帮助。

您不能通过将void *转换为不同的指针类型来取消对它的引用,因为取消对指针的引用就是获得指向的对象的值。裸void不是有效类型,因此无法取消对void *的引用。

指针算法是关于通过指向对象的sizeof的倍数来改变指针值。同样,因为void不是true类型,所以sizeof(void)没有意义,所以指针算法在void *上是无效的。(有些实现允许这样做,对char *使用等效的指针算法。)

票数 32
EN

Stack Overflow用户

发布于 2009-06-04 07:43:13

您应该知道,与Java或C#不同的是,在C中,绝对不可能成功地“猜测”void*指针所指向的对象类型。类似于getClass()的东西根本不存在,因为这些信息无处可寻。因此,您要寻找的那种“泛型”总是带有显式的元信息,比如示例中的int bprintf函数家族中的格式字符串。

票数 16
EN

Stack Overflow用户

发布于 2010-10-22 23:25:28

空指针称为泛型指针,它可以引用任何数据类型的变量。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/692564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档