在上一节的内容中,我们学习了不同的指针类型之间的区别之处等内容,今天我们往下学习,今天的主要学习内容是const修饰指针
、浮点数的存储
相关的内容,好了,话不多说,开整!!!
const修饰指针
我们在之前学习过const
,如果用它来修饰一个变量,则其在后面不可更改,如下:
#include<stdio.h>
int main()
{
const int a = 7;
a = 8;
return 0;
}
编译查看结果:
提示我们其为一个只读变量,既然const可以修饰变量
,自然也可以修饰指针
,因为指针本质上就是一个变量,只不过是用来存放地址而已。
const在前
如果我们将const放在指针前,如下所示:
#include<stdio.h>
int main()
{
int a = 50;
int b = 0;
const int* p = &a;
*p = 20;
printf("%d\n",*p);
return 0;
}
其能否运行呢?编译查看结果发发现报错:
这说明我们此时不能够通过指针来修改内存中的值了,也就意味着此时的const修饰的是*p
,那么其能否指向另一个地址呢,我们试一试,代码如下:
#include<stdio.h>
int main()
{
int a = 50;
int b = 0;
const int* p = &a;
// *p = 50;
p = &b;
printf("%d\n",*p);
return 0;
}
发现此时可以进行编译:
因此,
const在前时,无法通过指针改变内存值,但是可以改变指针的指向地址
也即可以重新指向别的地址,但不能改变原地址对应的内存中的值
const在后
当const在前
时,我们从上面知道了其修饰的*p
,那么如果const在后面呢,比如以下代码所示:
#include<stdio.h>
int main()
{
int a = 50;
int b = 0;
// const int* p = &a;
// *p = 50;
int* const p = &a;
p = &b;
printf("%d\n",*p);
return 0;
}
那么此时显然其修饰的
就不是*p
了,不然也就没有说明的必要了,哈哈哈哈。
那么其修饰的到底是什么呢,我们先编译上述结果,同样出错:
这说明此时肯定是无法指向其他的地址了,那么此时能不能通过指针修改a的值呢,我们试一下,在上述代码后加入如下代码,并注释printf
上一行代码:
*p = 40;
编译运行,发现可以得到结果:
由此我们可以看出:
const在后,修饰的是地址也就是p本身,此时无法再重新指向其他地址,可以通过指针更改内存的值
两种情况对应的结果恰恰相反,大家可以好好理解以下。
浮点数在内存中的存储方式
我们都知道,整型
在内存中占用4个字节
(32位机器),浮点型分为单精度浮点型
和双精度浮点型
,各自在内存中占用4个字节
、8个字节
,我们知道整型数据在内存中就是由0/1共32个比特位组成的,比如1就是
00000000000000000000000000000001
,浮点数有可能带有小数,我们以单精度浮点数
比如说3.5
为例,我们用计算器算出其二进制表示
:11.1
,如果想要自己换算也可以,大家可以自行查看相关的方法。
那么浮点数3.5就是以11.1存放在内容中吗?
下面我们用以下代码进行测试:
#include<stdio.h>
int main()
{
int a = 5;
float* p = (float*)&a;
printf("%d\n",a);
*p = 3.5;
printf("%d\n",a);
return 0;
}
我们查看结果:
请问马老师,发生甚么事了,这是怎么回事,
从上述的结果中,我们可以看出其浮点型与整型两种数据存放方式肯定是不一样的
,不然怎么会打印不出这样的结果,接下来我们就分析以下浮点型是如何存放的,此处以单精度浮点型为例。
- a = 11.1 二进制表示,
- 1.11*2^1 “科学计数法”表示
- 又可以表示为: ( − 1 ) 0 ∗ 1.11 ∗ 2 1 (-1)^0*1.11*2^1 (−1)0∗1.11∗21
- 按照如下形成拆解: ( − 1 ) s ∗ M ∗ 2 E (-1)^s*M*2^E (−1)s∗M∗2E
- 其中s为符号位,0表示正数,1表示负数,M为有效数字,1<=M<2;E为指数:其值为小数点向左移动了几位
则s=0;M=1.11;E=1;然后按照其在计算机中的存储方式如下:
其中,此时的E需要加上一个中间数127
(对于单精度浮点型),所以此时的E的存储结果为 127+1 = 128;二进制数为
10000000
,
有效数字小数点前的1不存,用的时候再加回来就好,
后面的小数顺序接续存放,空余位填入0,于是存储如下:
0 10000000 11000000000000000000000
将其化为十进制数,可见:
确实就是上述程序所打印出来的值,可以看到16进制
值为0x40600000
,那计算机是不是存储的这个值呢,我们调试看一下:
结合上节内容,其为小端存储
,因此其值就是:0x40600000,确实和我们计算的一样,到此为止,我们就介绍了单精度浮点型在内存中的存储方式。
当然了,这部分内容目前来说,没有发现甚么实际的用途,大家张张知识就好了,用到的时候再说。
上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!