[英]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;
然而,除了提到的其他海报的潜在对齐问题外,它至少还有两个可移植性问题:
header [0x1E] << 24 + header [0x1F] << 16 + header [0x20] << 8 + header [0x21];
此外,如果它是rici假定的bmp文件头,则该字段可能是无符号的,并且转换为已签名的int。 在这种情况下,它与零相比并不重要,但在某些其他情况下它可能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.