• C/C++问题:一个指针的大小是多少?怎么理解指针变量的存在


    目录

    举例

    一、

     int a;

    int (*(*v)[])();

    二、

    int func();

    int (*func)();

    三、

    const;

    int const a;

    const int a;

    int const*r;

    int *const r;

    四、一个指针的大小是多少?(补充)


    举例

    一、

     int a;

     可以看到上面声明了一个变量,自然一眼就可以看懂;那下面这个呢??

     如果你被绕晕了,那我会教你一个有用的方法;按照这个方法你会读懂任何类型的声明

    第一步:找到变量名

     第二步:向右看

     第三步:再次往左看

     第四步:如果有括号的话跳出一层括号

     第五步,重复上述过程,直到读出最终的类型。以上过程同时适用于变量函数的类型声明,

    包括函数指针。学会了上面的过程,那让我们举一些具体的例子来操练一下吧

    int *v[5];

     每个元素都是指向int的指针或者更符号汉语习惯的v是一个有5个指向int的指针的数组,那么加上括号又是个什么意思呢??

    我们要先考虑括号内的声明 所以:

     

     V是一个指向有5个整数的数组的指针

    现在让我们搞点比较复杂的东西,那就是下面这个

    int (*(*v)[])();

     所以v是一个int型函数指针组成的数组,看明白这个你就知道怎么回答上面这个问题了。

     

    所以完整的说就是:v是一个指向int 型函数指针组成的数组的指针

    二、

    下面让我们来看看函数指针

    int func();

    int func()是个函数声明,func();是个返回int型的函数

    那么下面这个呢?

    int (*func)();

    int (*func)();

     

     所以func是个指针,指向一个返回int型的函数,这就是函数指针

    三、

    最后我们聊聊const

    const;

       const是常量声明,意思是不能改变变量的值;const处在变量声明中不同位置的时候,效果是不一样的;很多在同学在学习的时候容易混淆

    int const a;

    最简单的int const a;等价于const int a;意思是a的值不能改变

     

    加入指针的情况下会变得稍微复杂一点。

      所以r是一个指向const int的指针,*r不能改变;但是r本身不是const,所以可以改变。

    const int a;

    不能够改变的int型变量

    int const*r;

    你可以直接给r赋值,让它指向别的地方。

    int *const r;

    我们把const和*的位置互换一下,效果就又不一样了。

     指向int 意味着r的值本身不能够改变,同时也不能给r进行赋值;但是int没有const修饰

    所以*r是可以改变的

    四、一个指针的大小是多少?(补充)

        对于现在学c/c++的新人,经常碰到一个简单但容易犯错的问题

    指针的大小是多少??

     不如换种说;一个指针在内存里面占多少个字节??

     举个例子  我们现在有三个指针,分别指向一个char 和double还有一个struct;这个struct里面还有一个char和一个长度为100的float的数组。

    那么请问这三个指针的大小是多少??

     有些同学可能认为指针跟指向类型的大小是一样的,比如char指针和char一样是一个字节;double指针和double类型一样占8个字节;上面的struct占401个字节,那么指向它的指针也占401个字节,然而这只是一个错误的经典理解。其实不论在什么样的机器上,在同一个机器中。不管指向什么,指针的大小都是固定的,都是跟内存的地址一样长。为了去理解这个问题,我们需要知道

    指针是什么?? 指针的本质就是内存的地址,所以一个内存地址有多长,一个指针就有多大


     这就是我们经常听到的两个概念;32bit架构和64bit架构,这是什么意思呢??

     

     计算机的内存是一块一块连续的区块,每个区块可以存放 1byte的的信息;

    这些区块就像一些房子,我们可以给他们依次编号,这里需要注意的是,现在计算机内存的最小单位是一个字节而不是一个比特;1个字节等于8个比特

     那么给第一个地址编号0001,第二块编号0002;以此类推

     给第9999块编号9999,假如我们只用四位数记录地址;那么我们只能有9999块内存,换算成二进制,在32bit的机器中;我们使用32个比特来记录一块内存的地址;

      在64bit的机器中,我们使用64bit来记录一块内存的地址;因此32bit内存地址编号的最大值就是32bit的上限,也就是2的32次方;这个容量换算成我们熟悉的单位就是4GB;64bit的机器的内存地址编号的最大值也就是2的64次方;一共是17179869184G的内存。

    考虑到现在的主流配置还是16GB,64bit的架构应该在很长一段时间都不会过时了;不会产生向新的向128bit升级的需求

     既然指针存储的是内存的地址,而内存的地址在32位架构上是4个字节;那么32位架构的指针就是4个字节。同理64bit架构的指针就是8个字节。


    实际情况中,可执行程序是由编译器产生的二进制码,

    因此指针的大小实际上是由编译器决定的。

         到这里就全部讲完了。 

                                                     完结撒花!!🎇🎇🎇

  • 相关阅读:
    Word批量删除空白行
    工具及方法 - 二进制编辑软件
    时间戳 太平洋夏令时间和本地时间相互转换及自定义夏令时
    每日leetcode[最后一个单词的长度】
    公钥密码学中的公钥和私钥
    Python 关于加密和解密
    springboot 集成 docsify 实现随身文档
    2068. 检查两个字符串是否几乎相等
    BIM → CIM,捷码赋能智慧城市多行业应用开发
    Linux常用命令——chroot命令
  • 原文地址:https://blog.csdn.net/weixin_72686492/article/details/127932777