一個指針變量内部可以存儲一個值,這個值是另外一個對象的位址,是以我們說一個指針變量可以指向一個普通變量,同樣這個指針變量也有一個位址,也就是 說有一個東西可以指向這個指針變量,然後再通過這個指針變量指向這個對象。
那麼如何來指向這個指針變量呢?由于指針變量本身已經是一個指針了(右值),那 麼我們這裡就不能用一般的指針了,需要在指針上展現出來這些特點,我們需要定義指針的指針(二重指針)。
綜合以上的所有點,下面是我們常常看到一些比對(也是經常出錯的地方):
函數 不會産生編譯時刻的可能值(但邏輯上不一定都對)
函數
不會産生編譯時刻的可能值(但邏輯上不一定都對)
fun1
a, &a[i], *b ,b[i],&b[i][j] ,&c ,d[i]
fun2
b,b+i,
fun3
d
fun4
fun5
fun6
b
fun7
a
為什麼可以有這樣的搭配,原因如下:
對于fun1 fun4 fun 5: 在編譯器看來fun1,fun4,fun5的聲明是一樣,在編譯時候,編譯器把數組的大小舍去不考慮,隻考慮它是一個指針,也就是說有沒有大小說明是一樣的,是以三者的形式都是fun1的形式(其實隻要提供了int*指針就可以了);
對于fun7 :以上的解釋對于引用是不适用的,如果變量被聲明為數組的引用,那麼編譯器就要考慮數組的大小了,那麼必須和聲明一模一樣(是以fun7就隻有a合适);
對于fun2:p是一個指向一個含有3個元素的數組,這樣b和b+i正好合适,而a卻不是(它是指向a[0]的,不是指向這個數組的);
對于fun3:p是一個指針的指針,而d指向d[0],同時d[0]又是一個指針,是以d就是一個指針的指針。但是b卻不是(它是一個2*3的矩陣也就是年int [2][3]類型);
對于fun6,p是一個2*3的數組類型,和b恰好完全比對;