如何对类型指针的增量起作用?

时间:2015-12-31 19:38:48

标签: c pointers pointer-arithmetic postfix-operator

此代码打印“世界”它是如何做的,任何人都可以解释?

    #include<stdio.h>
    int main()
    {
        char i =10;
        char *pc = (char*)&i;
        int *pi = (char*)&i;
        pi++ && pc++;
        if((void*)pi==(void*)pc)
            printf("hello");
        else
            printf("world")

    }

2 个答案:

答案 0 :(得分:2)

引用章节§6.5.2.4, Postfix递增和递减运算符来自C11标准,(强调我的

  

后缀++运算符的结果是操作数的值。作为副作用,   操作数对象的值递增(即,适当类型的值为1   添加到它)。 [...]

现在,在你的情况下,

  1. 最初,pcpi指向同一地址。
  2. pc是指向char类型的指针,而pi是指向int类型的指针。
  3. 接下来,

    • 执行pc++后,pc将按类型char的大小递增。因此,pc指向与(char *)pc + sizeof(char)
    • 相同的内存位置
    • 执行pi++后,pi将按类型int的大小递增。因此,pi指向与(char *)pi + sizeof(int)相同的内存位置。

    现在,sizeof(char)为1并且考虑sizeof(int)是4/8(32/64位平台),您可以理解,pc和{{1}持有的最终指针将会有所不同。

    因此,pi评估为假。

答案 1 :(得分:0)

使用指针算法,考虑指针移动经过多少字节以获得它指向的1个完整对象是很有用的。

int指针指向int个对象。将int指针移过1 int对象需要将指针移动到该int对象中的所有字节(在64位计算机上为8字节)。

类似地,将指针移动到超过1个此类对象的更大对象将涉及将指针移动到 对象中的所有字节。

因此,如果您考虑将指针递增(或递减)为将指针移动到对象(或对象)之前(或之前),则很明显指针值(地址)必须按字节数更改在那个对象中。

在您的示例中,两个指针最初都指向内存中的相同地址。递增int指针会将其移动int的大小,递增char指针会将其移动char的大小。它们的价值最终会有所不同,因为每个价值都会因不同的价值而变化。