C语言学习(十八)---不同类型的指针的区别、大端小端

在前一节的内容中,我们进一步学习了结构体,并对外部变量的使用进行了演示,今天让我们继续向下学习,今天学习的主要内容有两个:不同类型的指针的区别大端小端,下面将逐一进行介绍,话不多说,开整!!!!

不同指针类型的区别

基础学习3时,我们初步学习了指针变量,所谓指针变量也就是用来存放地址的一个变量,那么由于变量的不同肯定就会有很多不同的指针类型,如下代码所示:

    int a = 1234;
    char b[] = "abcsd";
    int* p = &a;
    char* p2 = b;

在上述代码中,我们定义了两种不同类型的指针,一个整型指针、一个字符指针,那么这两个指针有什么区别呢,既然指针都是用来存放地址的,为什么还要分各种类型呢?

区别1

存在即合理,实际上,不同类型的指针还真实有着天差地别,我们不妨对上述定义的两个指针分别向前走一步,看看下一次指针的位置和上一个指针的位置有什么区别,代码如下:

#include<stdio.h>
int main()
{
    int a = 1234;
    char b[] = "abcsd";
    int* p = &a;
    char* p2 = b;
    printf("%p\n",p);
    printf("%p\n",p+1);
    printf("%p\n",p2);
    printf("%p\n",p2+1);
    return 0;
}

编译运行,可以看到结果:
在这里插入图片描述
可以看到,整型指针一步走了4个字节,而字符指针一次只走了1个字节,因此我们就得到到了不同指针类型之间的区别1

不同的类型的指针,决定了其步进时的步长为多少
整型则为4字节,字符则为1字节,双精度浮点型将为8字节

区别2

既然不同指针类型的步长不同,那么自然在其在访问变量时的权力是不是也就各不相同呢
我们进行分析:由于整型指针每步长4字节,因此一次就可以访问四个字节的内容,而字符指针就应该只能访问1个字节了,那究竟是不是这样呢,我们进行验证,代码如下:

#include<stdio.h>
int main()
{
    int a = 0x11223344;
    int* p1 = &a;
    char* p2 = &a;
    *p1 = 0;
    printf("%d\n",*p1);
    // *p2 = 0;
    // printf("%d\n",a);
    return 0;
}

首先我们定义了一个16进制数a,为例便于查看区别,我们在此处启用调试模式,先注释掉后两行,进行调试,此时我们采用整型指针,将该地址指向的变量值更改为0,我们查看监视窗口结果:
在这里插入图片描述
可以看到此时的a值确实为11223344,我们步进,再查看a的值,如下:
在这里插入图片描述
可以看到,此时的a值已经通过指针更改为了00000000,那么我们再采用字符指针对其进行调试,结果如下:

在这里插入图片描述
在这里插入图片描述
此时我们发现,经过字符指针的修改a的值变为了11223300而不是00000000,那这不就是和我们分析的一样吗。
整型指针一次访问四个字节,所以将a值变为0,而字符指针每次访问一个字节,所以将a值改为11223300,因此我们也就得出了不同指针的第二个区别:

不同类型的指针,其操作内存时的大小不同

大端小端

我们知道,所有的数据在计算机中都是以二进制的数据0、1进行存储的,那么在进行储存时,数据自然可能需要多个空间才放的下,此时就涉及到了地址问题,比如一个数1234,是1在高地址还是4在高地址,此时按照数据的在内存中的存放方式就被分成了两种方式,即大端和小端模式

大端模式:高位数据存放在低地址,低位数据存放在高地址
小端模式:高位数据存放在高地址,地位数据存放在低地址

光看文字,可能有点懵懂,通过下面这幅图你可以就明白了是什么意思:
在这里插入图片描述
那么我们就来验证以下我们的计算机是小端存储还是大端存储数据呢?
从上图中我们看到,只要知道数据存储的最低位是1还是4就可以辨别出其属于哪种存放方式了,因此就需要访问第一个字节中的内容
我们如何对一个整型数据进行单字节的访问呢,由于整型数据是4字节的大小,直接访问的话行不通,那么联想上面的指针的区别,我们是不是可以采用字符指针来进行访问呢,因为字符指针在访问内存时,一次只能访问一个字节,这不正是我们想要的效果吗,这样就可以访问整型数据中的一个字节了,我们尝试一下如下:

#include<stdio.h>
int main()
{
    int  a = 1;
    char* p = (char*)&a;
    if(*p == 1)
    printf("小端存储\n");
    else 
    printf("大端存储\n");
    return 0;
}

也就是说:
在这里插入图片描述
如果低地址对应的是00,那么就应该是大端存储,如果低地址对应的是01,就应该是小端存储,我们编译查看结果:
在这里插入图片描述
进入调试模式,可以看到,a的存储方式确实是小端存储方式:
在这里插入图片描述

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

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

机器 xiaohu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值