C/C++问题:一个指针的大小是多少?怎么理解指针变量的存在
创始人
2024-04-10 01:26:43
0

目录

举例

一、

 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个字节。


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

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

     到这里就全部讲完了。 

                                                 完结撒花!!🎇🎇🎇

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...