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


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

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

     到这里就全部讲完了。 

                                                 完结撒花!!🎇🎇🎇

评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Martinenbule

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

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

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

打赏作者

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

抵扣说明:

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

余额充值