文章目录
- 前言
- 一、数据存储的截断问题
- 二、指针解引用访问问题
- 总结
前言
开门见山
int main()
{
int arr[] = { 1,2,3,4,5 };
short* p = (short*)arr;
int i = 0;
for (i = 0; i < 1; i++){
*(p + i) = 0;
}
for (i = 0; i < 5; i++){
printf("%d ", arr[i]);
}
return 0;
}
结果是什么?具体底层是如何实现的?存储方式不同时结果会改变吗?
int main()
{
printf("%dn", sizeof('1'));
char c = '1';
printf("%dn", sizeof(c));
return 0;
}
结果又是什么?具体底层又是如何实现的?存储方式不同时结果会改变吗?
一、数据存储的截断问题
int main()
{
printf("%dn", sizeof('1'));
char c = '1';
printf("%dn", sizeof(c));
return 0;
}
上述代码中:
char c = ‘1’ ; 这一步骤中:
- 首先,'1’再放入内存空间之前,自身先转为二进制序列(转化的二进制序列数目取决于自身类型);
- C语言中,'1’为单纯裸字符(未存入char类型),被看作int型,转为int类型对应的32位二进制:0~ 0~ 0~ 00110001('1’对应ASCII码十进制49的二进制序列);
- 存入char类型开辟的1个字节的内存空间前,先截断,后存储;
- 截断:截取’1’对应二进制的最低权值位的8个比特位:00110001;
- 存储:将截取的8个比特位放入char类型在内存开辟的1个字节(8个比特位)空间。(1个字节无需考虑存储方式)
二、指针解引用访问问题
int main()
{
int arr[] = { 1,2,3,4,5 };
short* p = (short*)arr[0];
int i = 0;
for (i = 0; i < 1; i++){
*(p + i) = 0;
}
for (i = 0; i < 5; i++){
printf("%d ", arr[i]);
}
return 0;
}
上述代码中:
short* p = (short*)arr[0]; 这一步骤中:
- 因为short类型指针只能指向(short类型)2个字节的二进制数据,而此处让它指向整型数据,那么究竟指向这四个字节对应的哪两个呢?
- 数组先存入内存,然后指针再按照由低地址向高地址向后取自身指向的二进制数目指向;
- 首先,以vs小端存储为例,arr数组先整体以小端先存在内存中,arr[0]对应小端存储在内存中的序列(从左向右从低地址向高地址):00000001 0~ 0~ 0~;
- 然后,p指针指向的是arr数组首元素在内存中的,它是按照由低地址向高地址向后拿了两个字节的内容,即:00000001 0~;
- 注意:指针解引用访问问题,不同存储方式下,结果可能不同。如果是大端存储,答案就是:1 2 3 4 5
总结
这里对文章进行总结:
以上就是今天总结的内容,本文仅仅简单介绍了我自身使用的一些困扰点。
真欢迎各位给予我更好的建议,欢迎访问!!!小编创作不易,觉得有用可以一键三连哦,感谢大家。peace
希望大家一起坚持学习,共同进步。梦想一旦被付诸行动,就会变得神圣。
欢迎各位大佬批评建议,分享更好的方法!!!



