C-指针

953 词

程序运行在内存上,变量自然存储在内存中。而内存那么大,又需要接受操作系统的管理,就需要标记每一块内存区域的位置。内存就像一个巨大的小区,每一块内存都有自己的“门牌号”—-内存地址。而指针则是一种特殊的变量,与一般变量储存变量本身直接指向内存区域不同,指针储存变量的内存地址。

指针一般占用四个字节(32bit),所有类型都有对应的指针类型(包括指针类型本身)。指针类型之间可以显示转换。

声明指针

指针根据指向变量的数据类型一般读作指向xxx的指针。

1
2
3
4
5
6
variable_type* pointer_name//在variable_type和pointer_name之间只需一个*即可,空格数量不限
int* p1;
int *p2;
int * p3;
int*p4;
//都是 指向int的指针

无类型指针
指针可以声明为 void 类型,如 void* voidptr ,表示无类型指针,可以指向任意地址。

指针类型的判断
指针的声明可以很复杂,比如这个 char const* const ptr ,遇到这种情况有一个很简单的快速判断指针类型的方法:从右往左读。比如这个,就是 常 指针 指向 常 char ,即指向常量 char 的常指针。指向常量的指针标识指针指的是常量,常指针指表示指针自身是常量。

变量地址

在声明一个指针之后,这个指针还是一个野指针,不知道会指向什么地方。想让指针指向一个实际变量就需要获取变量的地址。 C 中获取变量的地址使用 & 运算符。只要这个变量在内存上,就可以对这个变量使用 &

1
2
int var = 10086;
int* ptr = &var;//获取var的地址

register 存储类由于存储在CPU内部的寄存器上,并不存在于内存中,因此不能使用 &

访问指针

指针指向变量所在的内存区域。你可以顺着门牌号去找某一户人,自然也可以顺着指针去访问某个变量。访问指针指向的变量使用 * 运算符。

1
2
3
4
int var = 10086;
int* ptr = &var;//获取var的地址
*ptr = 114514;
int v = *ptr

对指针使用 * 运算符时,相当于之间访问这个变量本身,和访问变量别无二致。

写在最后

这样一看指针似乎内容不多,但是别忘了,所有类型都有衍生的指针类型,其他部分也会和指针产生复杂的联动。可以说,指针是 C 的灵魂。

留言