一. C语言指针介绍
C语言指针是C语言里面非常让人头痛的存在,每次看到指针的时候,尤其是二级指针的时候,都想躲得远远的,导致对代码的理解非常的浅,无法真正理解代码设计者的意图。特别是Linux内核代码,结构体指针,函数指针比比皆是,如果对指针的本质没有深刻的理解,一定会被内核的汪洋大海中淹没,导致每次都是浅尝辄止,败兴而归。本文通过对指针的介绍,也让自己加深对指针的理解。
二. C语言指针的讲解
1. 从普通变量说起
先从一个简单的例子说起,代码如下:
int a = 12;
对于上述代码的理解:
机器在内存的某个地址开始开辟了4字节的空间,并且把数字12存储到这4字节的空间中。
示意图如下所示:
2. 一级指针
给出一个一级指针变量定义,代码如下:
int *b = &a;
对于上述代码的理解:
step 1 :机器在内存的某个地址开始开辟了4字节的空间 (指针的存储空间为4字节)。
step 2 :取得a变量的地址 (存储数字12的地址)。
step 3 :将step 2取得的地址的数值,存入到step 1所开辟的4字节空间中。
示意图如下所示:
一级指针理解:
我们在访问b这个变量的时候我们在访问什么呢?例如:printf("b = 0x%x\n", b);
其实我们是在访问step 1中开辟的4字节内存空间中的内容,而不是这4字节的起始地址。只是这个内容表示的是内存的某个地址的数值。
3. 二级指针
再给出一个二级指针的定义,代码如下:
int **c = &b;
对于上述代码理解:
step 1 :机器在内存的某个地址开始开辟了4字节的空间 (指针的存储空间为4字节)。
step 2 :取得存储b变量内容的地址。
step 3 :将step 2得到的地址存入到step 1中开辟的4字节内存中
示意图如下所示:
二级指针理解:
我们在访问c这个变量的时候我们在访问什么呢?例如:printf("c = 0x%x\n", c);
其实我们是在访问step 1中开辟的4字节内存空间中的内容,只是这个内容表示的是内存的某个地址的数值,而这个地址中存放的还是一个地址的数值。
三. 总结
1. 看到指针变量,首先就想到内存需要给这个变量分配一块空间,访问变量名就可以获取这块空间的内容。
2. 不管一级指针,二级指针,甚至三级指针,其实本质上都是一样的,都是内存的某个地址开始的空间(指针是4字节),存储着一个值,这个值代表内存的某个地址,区别在于程序需要通过几次取地址内容获取到最终的值。