c – 这个指针算术如何工作?
#include <stdio.h> int main(void){ unsigned a[3][4] = { {2,23,6,7},{8,5,1,4},{12,15,3,9} }; printf("%u",*((int*)(((char*)a)+4))); return 0; } 我机器的输出是[0] [1]的值,即23.有人可以解释这是如何工作的? 编辑:回滚到旧的令人讨厌的代码,正是呈现给我的:P 解决方法
所以你把你的数组放在内存中:
2,7,8... 这样做是将数组转换为char *,它允许您访问单个字节,它指向此处: 2,8... ^ 然后它添加四个字节,将其移动到下一个值(稍后将详细介绍). 2,8... ^ 然后它将它变成一个int *并取消引用它,得到值23. 这个代码在技术上有三个问题. 第一个是它假设unsigned的大小是4个字节. (因此4).但这不一定是真的!更好的是sizeof(无符号),无论无符号大小如何,都要确保正确性. 第二个问题是强制转换为int:原始数组是无符号的,但是值被强制转换为int.在无符号范围内存在int无法表示的值(因为在范围的int半部分中为负数.)因此,如果数组中的某个值不能表示为int(意味着该值大于INT_MAX),你会得到错误的价值.更好的是转换为unsigned *,以保持正确的类型. 最后一件事是格式说明符.整数的说明符是%d,但代码使用%u,这是无符号整数.实际上,即使回退到int *是错误的,printf也会将该值转换回unsigned *,恢复它的完整性.通过解决问题二,问题三解决了问题. 有一个隐藏的第四个问题:代码很糟糕.这可能是出于学习目的,但是很糟糕. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |