c 语言 怎么分1级2级,C语言中的一级指针很容易懂,那么“二级指针”该怎么理解呢?...

经过前面几节的讨论,相信读者对于C语言中的指针应用已经比较熟悉了。粗略来说,可以把指针当作C语言中一种特殊的数据类型,只不过这个“数据类型”的内容比较丰富,功能比较强大,指针并没有什么难的。

7d20aa7b597fda49d25be068601b176b.png如何理解C语言的二级指针

如何理解C语言的二级指针?

不过,有读者看了本专栏关于C语言指针的文章后,或者回复或者私信我说:“我觉得C语言中的一级指针很简单,但是二级指针就迷糊了。”的确,前面几节文章的主题主要是一级指针,对二级指针并无多少讨论。

其实,如果读者已经比较了解一级指针,二级指针并无多少难点。在讨论C语言指针时,我一直在强调“将指针看作普通数据类型”,要是读者能够记住这一点,在看到二级指针时,将其与其他普通数据类型对比分析,会发现其实二级指针也没什么难的。

22ff34bce5de223b6707591ce5ad7659.png二级指针也没什么难的

例如 int 型是C语言程序中常用的基础数据类型,int * 指针也是比较容易理解的:

b1cca6000cb0ca80a78beef027742c5a.pngint * 指针比较容易理解

例如上面这段C语言代码,p 是 int * 指针,它指向 int 型数据,这是非常基础的指针应用。现在新增所谓的二级指针 pp:

10dbb554a0a9fe1b67ffd992c1648c09.png二级指针 pp

该如何理解这段C语言代码中的 pp 呢?我知道很多人习惯称 pp 为“指针的指针”,如果读者觉得这个说法比较费解,可以暂且不用理会。事实上,按照我一直强调的“将指针看作普通数据类型”这个小技巧,int ** pp 可以分开来看:

int* *pp;

紧挨着 pp 的 说明 pp 是一个指针,int 则说明它是一个指向 int 型数据的指针。int 型数据也即所谓的指针类型数据,所以 pp 是“指向指针的指针”。现在再来看:

int **pp = &p;

就不难理解了,p 则是一个指向 int 型数据的指针, &p 表示 p 的地址,pp 指向该地址,所以有些程序员称 pp 为二级指针。事实上,如果使用 typedef 将 int * 定义为一个普通数据类型:

typedef int* IPTR;

再来重写 pp 的C语言定义,一切看起来就和一级指针没什么两样了:

beba768cc75590c4e13e262df5c79f53.png看起来就和一级指针没什么两样

所以如果读者是C语言初学者,不建议纠结一些“专业”的名词,比如“指向指针的指针”,“二级指针”,“多级指针”等,这些文绉绉的词常常会妨碍初学者理解C语言。事实上,多级指针的概念是递归的,读者的C语言基本功如果非常扎实,很容易就可以将多级指针写成“一级指针”。

4423fad0e2761f27fff09c78e389e92e.png很容易就可以将多级指针写成“一级指针

C语言多级指针的应用

现在读者应该知道如何分析C语言中的多级指针了,不过可能有些读者仍然会有疑问:C语言的多级指针这么难理解,它有存在的意义吗?

答案当然是肯定的,看了本专栏前面几节文章的读者应该能够发现,借助于结构体和指针,C语言能够完成很多“不可思议”的工作,包括传递各种类型的数据。既然C语言中的指针类型也可看作是“普通数据类型”,那传递指针类型的数据时,C语言就需要指向指针类型数据的指针,也即所谓的“多级指针”。

如果读者觉得“指向指针类型数据的指针”费解,可联想其他普通数据类型,例如“指向int类型数据的指针”。

下面是一个比较经典的例子,相关C语言代码如下:

ffe36b81ea5a72810010b59201b19cd5.png相关C语言代码

上面的 swap() 函数并不能交换变量 x 和 y 的值,这一点即使是C语言初学者也明白。不过,如果对 swap() 函数稍作修改,答案就不一样了。修改后的C语言代码如下:

12670a38bed9ab82ba0eaaeec3309505.png修改后的C语言代码如下

修改后的 swap() 的两个参数都是 int 指针,它能够交换 x 和 y 的值了,显然,int 型数据的例子很容易理解。现在对上述C语言代码做少许修改:将 int 修改为 int *:

dc932c50fe431994d6e0c1cf5b64bcb7.png将 int 修改为 int *

到这里可能有些读者会迷惑,swap() 为什么没有交换 x 和 y 的值呢?它的参数是指针啊?其实,只要使用 IPTR 代替 int * ,一切就又清晰了:

34b238fb634ef5c9c79ca6883e2a2219.png一切就又清晰了

上面这段C语言代码和第一个例子并无太大差异。如果希望成功交换 x 和 y 的值,swap() 函数需要做适当的修改:

d217096f124f7e94d0371036b992f505.pngswap() 函数需要做适当的修改

如果将 IPTR 还原:

b198a180a1c94376b892ea1834f5c4a4.png将 IPTR 还原

应该能够发现,原来我们已经能够自然而然的使用C语言的二级指针了呀,蛤蛤。在处理指针类型数据交换时,指针的指针(所谓的多级指针)自然而言的就被使用了。

小结

本节主要讨论了C语言中二级指针的概念,应该注意到,只要不神话指针,而是把它当作C语言中一种普通的数据类型,一切就简单了。

4fb7aa49c630611e83bee23d6c29a5a6.png点个赞再走吧

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

举报/反馈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值