May*_*ari 51 c arrays pointers
我正在学习C编程语言,我刚开始用指针学习数组.我在这个问题上有问题,我希望输出必须是5
但是2
,有人可以解释原因吗?
int main(){
int arr[] = {1, 2, 3, 4, 5};
char *ptr = (char *) arr;
printf("%d", *(ptr+4));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
And*_*ter 80
假设一个小的endian架构,其中int是32位(4字节),单个字节int arr[]
看起来像这样(较低地址的最低有效字节.所有十六进制值):
|01 00 00 00|02 00 00 00|03 00 00 00|04 00 00 00|05 00 00 00
Run Code Online (Sandbox Code Playgroud)
char *ptr = (char *) arr;
Run Code Online (Sandbox Code Playgroud)
现在,ptr
指向第一个字节 - 因为你已经转换为char*
,它被视为char数组向前:
|1|0|0|0|2|0|0|0|3|0|0|0|4|0|0|0|5|0|0|0
^
+-- ptr
Run Code Online (Sandbox Code Playgroud)
然后,*(ptr+4)
访问char数组的第五个元素并返回相应的char
值:
|1|0|0|0|2|0|0|0|3|0|0|0|4|0|0|0|5|0|0|0
^
+-- *(ptr + 4) = 2
Run Code Online (Sandbox Code Playgroud)
因此,printf()
打印2
.
在Big Endian系统中,每个字节中的字节顺序int
相反,从而产生
|0|0|0|1|0|0|0|2|0|0|0|3|0|0|0|4|0|0|0|5
^
+-- *(ptr + 4) = 0
Run Code Online (Sandbox Code Playgroud)