加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 这个指针算术如何工作?

发布时间:2020-12-16 06:47:34 所属栏目:百科 来源:网络整理
导读:#include stdio.hint 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.有人可以解释这是如何工作的? 编辑:回滚到旧的令人讨厌的代码,正是呈现给
#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 *,恢复它的完整性.通过解决问题二,问题三解决了问题.

有一个隐藏的第四个问题:代码很糟糕.这可能是出于学习目的,但是很糟糕.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读