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)
| 归档时间: |
|
| 查看次数: |
2187 次 |
| 最近记录: |