C语言int数组转char指针后零值成因及获取元素20的方法
问题解析:char指针访问int数组的字节输出与目标元素获取
一、输出中零值的逻辑
- 核心前提:当前系统中
int类型占4字节,char类型占1字节,且采用小端字节序(多字节数据的低字节存储在内存低地址处)。 - 数组
tab里的每个int元素,比如4,对应十六进制为0x00000004。按小端存储规则,内存中字节顺序为04 00 00 00(低字节在前)。 - 当你把
int*类型的数组首地址强制转为char*后,p[i]会按字节逐个读取内存。因此访问第一个int元素的4个字节时,输出4 0 0 0;第二个int元素6(0x00000006)的内存字节是06 00 00 00,对应输出6 0 0 0,以此类推。 - 元素
20的十六进制是0x00000014,内存字节顺序为14 00 00 00,所以对应输出中第17到20位(i=16至i=19)的20 0 0 0。
二、通过指针p获取元素20的方法
有两种直接可行的实现方式:
转回int*类型后按数组索引访问
既然p本质指向int数组的首地址,转回int*类型即可正常按int元素的方式访问:// 数组索引形式 printf("%d\n", ((int*)p)[4]); // 指针偏移形式 printf("%d\n", *( (int*)p + 4 ));这里的
4是20在tab数组中的下标(数组从0开始计数)。按字节偏移后转回int*访问
每个int占4字节,20是第5个元素(下标4),相对于首地址的字节偏移量为4 * 4 = 16。将p+16的地址转回int*后解引用:printf("%d\n", *( (int*)(p + 16) ));
内容的提问来源于stack exchange,提问作者Badie Sakka
相关产品推荐
相关产品推荐

