C语言学习(十九)---const修饰指针、浮点数在内存中的存储方式、

在上一节的内容中,我们学习了不同的指针类型之间的区别之处等内容,今天我们往下学习,今天的主要学习内容是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)01.1121
  • 按照如下形成拆解: ( − 1 ) s ∗ M ∗ 2 E (-1)^s*M*2^E (1)sM2E
  • 其中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,确实和我们计算的一样,到此为止,我们就介绍了单精度浮点型在内存中的存储方式。

当然了,这部分内容目前来说,没有发现甚么实际的用途,大家张张知识就好了,用到的时候再说。

上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器 xiaohu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值