*(int *)在C ++中的含义是什么?

时间:2013-10-03 20:06:41

标签: c++ opengl

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

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

3 个答案:

答案 0 :(得分:17)

让我们一步一步:

header[0x1E]

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

&(header[0x1E])

我们取该元素的地址。

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

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

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

我们取消引用指向int的指针,通过解释int的{​​{1}}字节,从偏移sizeof(int)开始,产生header,作为{{1并获取它在那里找到的值。

0x1E

它将结果值与int进行比较,如果它不是if ( *(int*)&(header[0x1E])!=0 ) ,则执行0语句正文中的任何内容。

请注意,这可能非常危险。考虑如果0被声明为:

会发生什么
if

......或作为:

header

答案 1 :(得分:6)

这真是一段可怕的代码,但它正在做的是:

&(header[0x1E])

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

(int *)addr

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

*p

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

答案 2 :(得分:1)

假设header是一个字节数组,原始代码只在intel上测试过,它等同于:

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

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

  • 在64位整数的平台上,它会产生一个字节0x1E到0x25而不是上面的int;在具有16位整数的平台上也会出错,但我认为那些太老了不重要
  • 在一个大端平台上,这个数字是错误的,因为字节会被反转,最终会变成:

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

此外,如果它是rici假定的bmp文件头,则该字段可能是无符号的,并且转换为已签名的int。在这种情况下,无关紧要,因为它与零进行比较,但在某些其他情况下它可能是。