指针在C语言中是一个很重要的概念.
那么什么是指针呢? 下面我们就来讨论讨论.
我们知道,计算机在处理数据时,需要的数据是在内存中读取的,而处理完数据又会放回内存当中.在计算机中,内存会被分为一个个内存单元,大小一个字节.那么每个内存单元都会有一个地址,就如同门牌号一样.
而C语言中,这个地址取了一个响当当的名字,就叫做"指针". 所以我们可以理解成 指针就是存放一个数据的地址.
下面来了解一下关于指针的操作符. 第一个是取地址操作符 '&'. 通过这个操作符可以将输入存储的地址找出来. 地址其实也是数据,所以也需要一个东西,来存储数据的地址,这个东西就叫做指针变量.
没错,就是用来存储指针的变量.
表达形式可以写成如下:
第二行代码解读如下:
先看右边:&a 说明是将一个数据的地址取出来并存起来了;
再看左边: 注意这个'*'号, 如果出现了'*'号,则说明他是一个指针变量, 而'*'号前边是int 则说明变量指向的是一个int类型的数
所以如果想存储指向其他类型的数的地址,只需要将'*'号前面的类型修改即可.
那么知道怎么存储一个地址了,那么怎么取出地址中的数据呢?
这就要请出指针相关的另一个运算符'*', 在前面给指针变量声明的时候也用到了它,而在这里它叫做解引用.就是将地址中的值解出来.表达形式:*指针变量名
如图:
其实解引用*p 和变量a本质上是一样的,*p就是找到存储a的空间并将a拿出来.所以如果对*p进行赋值,a的值也会改变.
会发现*p改变了,a也会对应改变.
指针变量的大小:
在32位平台下,地址是32个bit位,所以指针大小也是32个bit位,而 8bit = 1 Bye, 即4个字节.
同理,若是64位平台下,指针大小为8个字节
所以指针的大小与指针指向的类型是无关的,只和平台有关.
指针变量类型的意义:
上面说过,指针大小与类型是无关的,大小永远是4/8个字节,那么为什么会有各种各样类型的指针呢?
对比两段代码,第一段指针是int*, 第二段指针是char*. 而通过调试可知第一段代码中n内存中的四个字节都被修改为0, 而第二段中只有第一个字节被修改为0.
而int类型正好4个字节,char类型正好1个字节.
所以可以知道指针类型的第一个意义就是,不同的指针类型解引用之后可以访问的权限是不同的,取决于指针类型.
指针也可以进行+或者-整数运算,比如指针+1
它表示指针跳过一个所对应字节,这也和指针类型有关.
即如果指针是int*,那么它跳过的字节就是4个字节,如果是char*,就跳过1个字节,也可通过调试验证出来.
所以可以得出结论,指针的类型还决定了指针向前或者向后走一步有多大.(跳过多少字节)