C 数组输出指针
我有以下C语言程序:C 数组输出指针,c,arrays,pointers,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。您正在挑选arr[
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。您正在挑选
arr[1]
的第一个八位组。您的机器是具有4字节int
的little endian,因此构成arr[1]
的4个八位字节被写成十进制:
200, 0, 0, 0
因此,您将八位字节200解释为char
。您的char
已签名,并且您的计算机使用
200的二进制表示是
11001000
由于设置了最高有效位,因此当作为有符号值查看时,这是一个负数。所以,为了计算出负值的大小,我们将位反转,然后加一
00110111
十进制是55。因此,输出的值是-56。事实上,如果您有
sizeof(int)=2
,您希望得到44,因为此时*(ptr2+4)将指向300=256+44,十六进制表示为1002E
,最后一个字节为2E
,或者十进制表示为44
要获得独立于int上的大小的值,应编写:
printf("%d %d",*(ptr1+2),*(ptr2+(2 + sizeof(int)));
但它仍然取决于endianness,在大端计算机上给出0…为什么你认为它应该是
44
?它取决于endianness
好的,我在编译器中运行过,int是2字节。在这种情况下,它的输出为44。这还取决于一个整数需要多少字节。是的,对于两个字节的整数,该代码挑选出300
的第一个八位字节,它被存储为44,1
。也可以说,由于值是环绕的,char显然被解释为在-128-127范围内(通过这个特定的编译器),200被解释为负值200-256=-56。