数组输出指针

时间:2014-10-02 11:29:31

标签: c arrays pointers

我在C中有以下程序:

main() {
    int arr[5]={100,200,300};
    int *ptr1=arr;
    char *ptr2=(char *)arr;
    printf("%d\n",sizeof(int));
    printf("%d   %d",*(ptr1+2),*(ptr2+4));
    return 0; 
}

其输出如下:

4
300 -56

请解释最后的输出。根据我的理解,最后的输出应该是44而不是-56。

2 个答案:

答案 0 :(得分:4)

您正在挑选arr[1]的第一个八位字节。你的机器是带有4字节int的小端,因此构成arr[1]的4个八位字节被写为十进制:

200, 0, 0, 0

所以你将八位字节200解释为char。您的char已签名,您的计算机使用two's complement

200的二进制表示是

11001000

由于设置了最高有效位,因此当作为有符号值查看时,这是负数。因此,为了计算出负值的大小,我们将这些位反转,然后加一个。

00110111

是十进制的55。因此,输出值为-56。

答案 1 :(得分:2)

事实上,如果你有sizeof(int) = 2,你预期44会是什么,因为那时*(ptr2 +4)会指向300 = 256 + 44,其十六进制表示为1002E和a 2E的最后一个字节或十进制的44。

要独立于int的大小,你应该写:

printf("%d   %d",*(ptr1+2),*(ptr2+(2 + sizeof(int)));

但它仍将依赖于字节序,并在大端计算机上给出0 ...