在评论C言语指针时,我一向在着重“将指针看作一般数据类型”,要是读者可以记住这一点,在看到二级指针时,将其与其他一般数据类型比照剖析,会发现其实二级指针也没什么难的。
该怎么了解这段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言语界说,全部看起来就和一级指针没什么两样了。
所以假如读者是C言语初学者,不主张纠结一些“专业”的名词,比方“指向指针的指针”,“二级指针”,“多级指针”等,这些文绉绉的词常常会阻碍初学者了解C言语。事实上,多级指针的概念是递归的,读者的C言语基本功假如十分厚实,很简单就可以将多级指针写成“一级指针”。
现在读者应该知道怎么剖析C言语中的多级指针了,不过或许有些读者仍然会有疑问:C言语的多级指针这么难了解,它有存在的含义吗?
答案当然是必定的,看了本专栏前面几节文章的读者应该可以发现,借助于结构体和指针,C言语可以完结许多“难以想象”的作业,包含传递各种类型的数据。已然C言语中的指针类型也可看作是“一般数据类型”,那传递指针类型的数据时,C言语就需要指向指针类型数据的指针,也即所谓的“多级指针”。
假如读者觉得“指向指针类型数据的指针”隐晦,可联想其他一般数据类型,例如“指向int类型数据的指针”。上面的 swap() 函数并不能交流变量 x 和 y 的值,这一点即使是C言语初学者也了解。不过,假如对 swap() 函数稍作修正,答案就不相同了。
修正后的 swap() 的两个参数都是 int 指针,它可以交流 x 和 y 的值了,明显,int 型数据的比如很简单了解。到这儿或许有些读者会利诱,swap() 为什么没有交流 x 和 y 的值呢?它的参数是指针啊?其实,只需运用 IPTR 替代 int * 。swap() 函数需要做恰当的修正
应该可以发现,本来咱们现已可以天然而然的运用C言语的二级指针了呀,蛤蛤。在处理指针类型数据交流时,指针的指针(所谓的多级指针)天然而言的就被运用了。