繁体   English   中英

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

[英]What does *(int*) mean in C++?

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

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

让我们一步一步:

header[0x1E]

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

&(header[0x1E])

我们取该元素的地址。

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

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

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

我们解引用该指针到INT,产生一个int通过解译所述第一sizeof(int)字节header开始,偏移0x1E ,作为int ,并得到它找到的值。

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

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

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

double header [0xFF];

......或者:

int header [5];

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

&(header[0x1E])

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

(int *)addr

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

*p

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM