【问题标题】:Can we cast an integer value with a pointer type in c programming language?我们可以在 c 编程语言中使用指针类型转换整数值吗?
【发布时间】:2018-04-30 20:43:53
【问题描述】:

在很多c代码sn-ps中我看到(void *)0,用指针转换整数是什么意思?

【问题讨论】:

  • (void *)0 是一种写空指针常量的方法; NULL 也是如此,在许多情况下,0 也将在需要时转换为空指针常量(并且还有其他编写此类指针的方法)。如果被转换的值不为零,那么它有不同的用途,并且通常不太便携(意思是,根本不便携)。
  • “重复”并没有真正涵盖(void *)0
  • 我同意@M.M——重复的What does it mean to convert int to void * or vice versa?) 没有提到(void *)0,它确实具有可移植和合理的含义。副本正在讨论(void *)5 和类似的强制转换,主要是在pthread_create() 的“数据”参数的上下文中,这是一个相当特殊的(ab)使用将整数强制转换为空指针。\
  • 谢谢@JonathanLeffler,所以这是关键字NULL的另一种写法。
  • @HenokTesfaye:写(void *)0 是写NULL 的另一种方式,但NULL 不是关键字——它只是一个宏定义,当你包含任何一个标准时C 头文件(<locale.h><stddef.h><stdio.h><stdlib.h><string.h><time.h>)。

标签: c pointers


【解决方案1】:

一般来说,将整数转换为指针“意味着”创建一个指针值,指向内存中的确切数字地址。但是这里我把“意思”这个词加了引号,因为实际的意思比较复杂。

基本上有三种子情况。

  1. 如果整数是常量 0(尤其是转换为指针类型为 void * 时),这是一个 空指针常量。根据定义,它是为您提供空指针值的语法结构。根据定义,空指针不指向任何地方(它“与指向任何实际对象的指针相比都不相等”)。
  2. 在老式 C 编程中,直到今天在嵌入式 C 编程中,如果整数非零,它就是您尝试访问的实际内存地址。
  3. 在现代、可移植的高级 C 编程中,尤其是在 Stack Overflow 上,其含义最好是实现定义的,或者最坏的情况是未定义的,这意味着您不应该这样做,甚至可能不应该问关于它,因为没有人能确切地说出它的含义。

在回答您对 Jonathan Leffler 的评论时,NULL 实际上不是关键字,而是扩展为 (void *)0 或可能是普通的 0 的预处理器宏。 (一个普通的0 怎么可能在没有强制转换的情况下作为空指针常量正常工作,这是一个引人入胜但经常被严重误解的附带问题,我不打算在这里讨论。参见@ 987654321@ in C FAQ list 如果好奇的话。)

【讨论】:

  • 一个小问题:它可以扩展到((void*)0),但不能扩展到(void*)0。请参阅N1570 7.1.2p5,它要求在必要时用括号保护类对象宏的定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 2014-05-17
  • 2012-03-25
  • 2015-01-06
  • 2010-09-20
  • 1970-01-01
相关资源
最近更新 更多