指针

       指针这个东西,在C语言和C++中,可以说是使用的非常广泛的,有很多人说C++比Java难学,就是难在指针这块。

那么,什么是指针呢?

      谈到指针,实际上就必须先要了解内存,在冯诺依曼体系结构中,五大硬件单元里面,内存扮演的是存储器的角色,基本上我们所有的程序运行都是以内存为载体。(所以说基本上,当然是有特例的,比如位操作,就属于特殊的操作,这是把数据加载到CPU中,在寄存器上操作的)

程序的执行,内存中可能要加载很多的数据,怎么去在内存中寻找这一个个数据,这就要对内存有很好的管理方式。为了有效的使用内存,把内存空间划分成一个个小的存储单元,通常每个内存单元是被划分为1个字节,这也就是访问内存,都是以一个字节为基本单位的。

       为了有效访问每个单元,通常是给每个内存单元编一个号码,这个号码也就是内存单元的地址。就好像我们找一个房间里的某个人,我们可以通过房间的门牌号轻松的找到那个房间。假设没有这个地址,那么访问内存读取数据,就得一个个的对内存空间进行遍历,这样是非常可怕的,因为效率实在太低。

     那么这个地址,实际上也就是一个数据,既然是数据,当然可以保存在一个变量中。保存一个地址的变量,叫做指针变量,这样通过一个变量访问一个地址,这个指针变量就有了指向性,这也就是为什么我们把他叫做指针了。

  而指针变量也可以被取地址,再存放到一个新的变量里,新的变量就被称之为二级指针,依次类推,就还有多级指针的存在。

    要有一个指针,我们就首先要对被访问的那个地址进行取地址操作,把这个地址记录下来,取地址我们使用的是&符号,比如:

int num = 10;
int *p;//p就是我们设定的指针变量,它需要和被访问的数据类型一致
p = #

而通过这个指针变量找到原空间的操作,我们称之为解引用。

*p = num;

那么一个指针有多大呢?

指针的大小实际与被访问的空间的大小是没有关系的,就如同,门牌号与房子的大小没有关系一样。指针的大小是由硬件决定的看有多大内存,有多少总线,总之就是看内存怎么划分地址编号的。当然,实际上也就是取决于操作系统是多少位的。

我们以32位系统为例,通常运行32位系统的,内存也就是4G,那么32位系统,能表示的地址总数也就是2^32个字节,也就要有2^32个不同的地址。(32位系统能识别出的内存总数就是4G,超出这个大小的地方是不会被寻址的)。为了表示每个字节,就要对每个字节分一个地址。表示2^32个地址,由于一个字节是8个比特位,4X8刚好是32个比特位,也就可以说我们以4个字节存储一个地址,这也就是为什么32位系统下一个指针是4个字节了。

相应的,在64位系统下,一个指针变量就是8个字节大小。

为什么指针还要分类呢?比如int型指针,char型指针...

实际上指针类型,是跟着被访问的数据的类型的,被访问空间是什么数据类型的,那么它的空间就有多大,那样指针每次进行遍历。每走一步,要经过几个地址,就是由数据类型决定的。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值