學習c語言的同學,在指針的傳遞中,好多搞不明白,為什么被調函數的形參有的時候用指針的指針,而不是用一般指針。
一、如果是指針p已經有確定的指向且不需要在被調函數中改變它的指向(確定的指向也就是它的值,當然這個值一定是一個具體的地址,而不是NULL或野指針),只需要對指針p指向的地址進行操作,那么,被調函數形參請用普通指針就可以了;
二、假如指針p沒有具體指向(NULL,也可能是個野指針)或有具體指向,需要在被調函數中改變p的指向(給它賦予一個新的值,當然這個值是一個地址了),那么被調函數的形參pp就需要用指針的指針(主調函數&p),在被調函數中通過對指針的指針pp進行解引用(*pp),獲取指針p的地址(指針p),向p的地址(指針p)寫值,就可以改變p的指向了,比如在被調函數中malloc一個空間,將該空間的地址賦值給p。
三、有同學說了,普通指針也可以改變它的值,當然可以改變,改變了形參指針的指向,對實參毫無影響,實參還是指向原來的地址;還有同學說,什么指針,地址,變量弄不明白,這么說,所有的變量都是地址,指針變量,也是地址,不同的是指針變量保存的是地址,指針的指針只保存指針的地址,普通變量保存的什么不用說了吧,還有,請不要把p和&p混為一談,p是p(變量),&是運算符,&p是取p的地址,p = p1;是把p1的值賦值給p。
下圖的p是主調函數的指針變量;pp,q是被調函數的指針變量;c語言的參數傳遞是值傳遞;
指針的指針傳遞的是p的地址(200010) ,一般指針傳遞的是p的值(10001)
這個圖,是用網上的在線流程圖編輯器畫的,請點擊這里。