*((int *)ptr + 1)的含义

时间:2013-02-19 09:21:48

标签: c pointers casting type-conversion

假设ptr是一些指针:

*((int *)ptr+1)

意味着什么:

首先将cast ptr输入int *然后再加1,然后解除引用。

OR

首先将ptr递增1,然后进行类型转换,然后取消引用。

6 个答案:

答案 0 :(得分:3)

ptr是指向任何事物的指针。 (int *) ptr是指向int的指针,指向与ptr相同的位置,但假定指针为int(int *)ptr + 1在内存中进一步指向一个单元格(也称为一个int)。 *((int *)ptr+1)就是那个。

答案 1 :(得分:3)

演员阵容的优先级高于加法,c.f。 here。因此,首先转换为整数指针,然后添加1*sizeof(int)

答案 2 :(得分:2)

这似乎是ptr[1]的简短版本,如果ptr当然是int *指针。

所以

  

首先将cast ptr输入int *然后再加1,然后解除引用。

答案 3 :(得分:2)

第一个主张: 将ptr转换为int *,然后递增1,最后得到此地址的int。

这是一种处理结构化数据的方法,例如,当您在输入中只有一个char流时。

答案 4 :(得分:1)

*((int *)ptr+1)

表示:

  • 通过(sizeof(ptr))
  • 将指针指向内存中的下一个位置
  • 然后将指针强制转换为整数指针。
  • 然后获取第一个sizeof(int)字节!

答案 5 :(得分:1)

此代码几乎显示了您正在做的事情:

#include<stdio.h>

int main( ) {

    int onetwo[] = { 1, 2};
    /*create a void pointer to one two*/
    void* ptr = (void*) onetwo;

    printf ( "pointer onetwo[0] = %p\n", &onetwo[0]  );
    printf ( "pointer onetwo[1] = %p\n", &onetwo[1]  );

    /* since you are doing pointer arithmetics
     * it's really important you cast ptr back to
     * int* otherwise the compiler might not
     * return a pointer to onetwo[1] but if sizeof(int)
     * is 4 bytes
     */
    printf ( "value = %d\n", *( (int*)ptr + 1) );

    /* in this print statement ptr is still a void* when
     * it is incremented, therefore it points between 
     * onetwo[0] and onetwo[1]
     */

    printf ( "value = %d\n", * ((int*)( ptr + 1)) );

    /*casting to int* is for illustration properties */
    printf ( "This points between onetwo[0] and onetwo[1] because it's at %p\n", (int*) (ptr + 1));


    return 0;

}
我机器上的

输出产生:

~/programming/stackoverflow$ ./p
pointer onetwo[0] = 0x7fffdd8e2fc0
pointer onetwo[1] = 0x7fffdd8e2fc4
value = 2
value = 33554432
This points between onetwo[0] and onetwo[1] because it's at 0x7fffdd8e2fc1

我希望这能证明指针算术的一些效果。