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

Val*_*iev 4 c++ opengl

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

if ( *(int*)&(header[0x1E])!=0  )
Run Code Online (Sandbox Code Playgroud)

Joh*_*ing 17

让我们一步一步:

header[0x1E]
Run Code Online (Sandbox Code Playgroud)

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

&(header[0x1E])
Run Code Online (Sandbox Code Playgroud)

我们取该元素的地址.

(int*)&(header[0x1E])
Run Code Online (Sandbox Code Playgroud)

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

*(int*)&(header[0x1E])
Run Code Online (Sandbox Code Playgroud)

我们取消引用指向int的指针,int通过解释从offset开始的第一个sizeof(int)字节作为a 并获得它在那里找到的值.header0x1Eint

if ( *(int*)&(header[0x1E])!=0  )
Run Code Online (Sandbox Code Playgroud)

它将得到的值0与其进行比较,如果不是0,则执行if语句正文中的任何内容.

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

double header [0xFF];
Run Code Online (Sandbox Code Playgroud)

......或者:

int header [5];
Run Code Online (Sandbox Code Playgroud)

  • ...解释`header`的第一个`sizeof(int)`字节,从偏移量'0x1E`开始,作为`int`并获取值. (4认同)

Pau*_*ans 6

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

&(header[0x1E])
Run Code Online (Sandbox Code Playgroud)

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

(int *)addr
Run Code Online (Sandbox Code Playgroud)

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

*p
Run Code Online (Sandbox Code Playgroud)

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

  • "这真是一段可怕的代码".我认为应该在这个问题的答案中提到这一点.+1(不仅仅是当然). (2认同)