程序运行在内存上,变量自然存储在内存中。而内存那么大,又需要接受操作系统的管理,就需要标记每一块内存区域的位置。内存就像一个巨大的小区,每一块内存都有自己的“门牌号”—-内存地址。而指针则是一种特殊的变量,与一般变量储存变量本身直接指向内存区域不同,指针储存变量的内存地址。
指针一般占用四个字节(32bit),所有类型都有对应的指针类型(包括指针类型本身)。指针类型之间可以显示转换。
声明指针
指针根据指向变量的数据类型一般读作指向xxx的指针。
1 | variable_type* pointer_name//在variable_type和pointer_name之间只需一个*即可,空格数量不限 |
无类型指针
指针可以声明为void
类型,如void* voidptr
,表示无类型指针,可以指向任意地址。
指针类型的判断
指针的声明可以很复杂,比如这个char const* const ptr
,遇到这种情况有一个很简单的快速判断指针类型的方法:从右往左读。比如这个,就是常 指针 指向 常 char
,即指向常量char
的常指针。指向常量的指针标识指针指的是常量,常指针指表示指针自身是常量。
变量地址
在声明一个指针之后,这个指针还是一个野指针,不知道会指向什么地方。想让指针指向一个实际变量就需要获取变量的地址。 C
中获取变量的地址使用 &
运算符。只要这个变量在内存上,就可以对这个变量使用 &
。
1 | int var = 10086; |
register
存储类由于存储在CPU内部的寄存器上,并不存在于内存中,因此不能使用&
。
访问指针
指针指向变量所在的内存区域。你可以顺着门牌号去找某一户人,自然也可以顺着指针去访问某个变量。访问指针指向的变量使用 *
运算符。
1 | int var = 10086; |
对指针使用 *
运算符时,相当于之间访问这个变量本身,和访问变量别无二致。
写在最后
这样一看指针似乎内容不多,但是别忘了,所有类型都有衍生的指针类型,其他部分也会和指针产生复杂的联动。可以说,指针是 C
的灵魂。