1

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

    #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")

    }
4

2 回答 2

2

引用第 §6.5.2.4 章,标准中的后缀递增和递减运算符C11,(强调我的

后缀++运算符的结果是操作数的值。作为副作用,操作数对象的值会递增(即,将相应类型的值 1 添加到其中)。[...]

现在,在你的情况下,

  1. 最初,pcpi指向同一个地址。
  2. pc是指向 type 的指针char,而pi是指向 type 的指针int

下一个,

  • 完成后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 位平台),您可以理解,最终的指针由pcpi将有所不同。

因此,if评估为假。

于 2015-12-31T20:20:45.093 回答
0

使用指针算法,考虑指针必须经过多少字节才能越过它指向的 1 个完整对象是很有用的。

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

类似地,将指向某个较大对象的指针移过 1 个此类对象将涉及将指针移过对象中的所有字节。

因此,如果您将递增(或递减)指针视为将指针移过(或之前)一个(或多个对象),那么显然指针值(地址)必须根据该对象中的字节数而改变.

在您的示例中,首先两个指针都指向内存中的相同地址。增加一个int指针移动它的大小int,增加一个char指针移动它的大小char。它们的值最终会有所不同,因为每个值都会改变不同的值。

于 2015-12-31T21:09:52.107 回答