5

我在 OpenGL 教程中遇到了以下行,我想知道是什么*(int*)意思,它的价值是什么

if ( *(int*)&(header[0x1E])!=0  )
4

3 回答 3

17

让我们一步一步来:

header[0x1E]

header必须是某种数组,在这里我们得到0x1E对数组中第 th 个元素的引用。

&(header[0x1E])

我们获取该元素的地址。

(int*)&(header[0x1E])

我们将该地址转换为指向 int 的指针。

*(int*)&(header[0x1E])

我们取消引用指向 int 的指针,int通过将 的第一个sizeof(int)字节header从 offset 开始解释0x1E为 anint并获得它在那里找到的值。

if ( *(int*)&(header[0x1E])!=0  )

它将结果值与 进行比较,0如果不是0,则执行语句主体中的任何内容if

请注意,这可能非常危险。考虑如果header被声明为会发生什么:

double header [0xFF];

...或作为:

int header [5];
于 2013-10-03T20:11:16.920 回答
6

这确实是一段糟糕的代码,但它正在做的是:

&(header[0x1E])

获取数组的第 ( 0x1E + 1) 个元素的地址header,我们称之为addr

(int *)addr

C 风格将此地址转换为指向 an 的指针int,我们称此指针为 p:

*p

将此内存位置取消引用为int.

于 2013-10-03T20:15:57.650 回答
1

假设 header 是一个字节数组,并且原始代码仅在 intel 上进行了测试,它等效于:

标题[0x1E] + 标题[0x1F] << 8 + 标题[0x20] << 16 + 标题[0x21] << 24;

然而,除了其他海报提到的潜在对齐问题外,它至少还有两个可移植性问题:

  • 在具有 64 位整数的平台上,它将用字节 0x1E 到 0x25 生成一个整数,而不是上面的;在具有 16 位整数的平台上也是错误的,但我想这些都太旧了
  • 在大端平台上,数字将是错误的,因为字节会颠倒,最终会变成:

标题[0x1E] << 24 + 标题[0x1F] << 16 + 标题[0x20] << 8 + 标题[0x21];

此外,如果它是 rici 假设的 bmp 文件头,则该字段可能是无符号的,并且强制转换为有符号的 int。在这种情况下,它与零比较无关紧要,但在其他情况下可能。

于 2013-10-04T05:26:49.113 回答