2

假设 ptr 是一些指针,那么:

*((int *)ptr+1)

意味着什么:

首先将 ptr 类型转换为 int * 然后递增 1,然后取消引用。

或者

首先将 ptr 加一,然后进行类型转换,然后取消引用。

4

6 回答 6

4

ptr是指向任何东西的指针。(int *) ptr是指向 int 的指针,它指向与 相同的位置ptr,但假定指针对象是int(int *)ptr + 1在内存中进一步指向一个单元格(又名一个 int)。*((int *)ptr+1)那是int。

于 2013-02-19T09:24:41.657 回答
3

演员表具有比加法更高的优先级,请参见此处。因此,首先转换为整数指针,然后添加1*sizeof(int).

于 2013-02-19T09:26:59.023 回答
2

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

所以

首先将 ptr 类型转换为 int * 然后递增 1,然后取消引用。

于 2013-02-19T09:23:32.993 回答
2

第一个命题:将 ptr 转换为 int*,然后加一,最后得到这个地址的 int。

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

于 2013-02-19T09:23:36.793 回答
1
*((int *)ptr+1)

这意味着:

  • 通过(sizeof(ptr)) 增加指向内存中下一个位置的指针
  • 然后将指针转换为整数指针。
  • 然后获取第一个 sizeof(int) 字节!
于 2013-02-19T09:54:55.220 回答
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

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

于 2013-02-19T09:55:58.623 回答