**p[ ] 和 *(*p)[ ] 的區別

有關指針部分的疑惑,瀏覽到他人很有幫助的解答,引用一下並捎帶自己的理解碼一下。

如果是表達式,那麼方括號裏應該有個數字,或變量,否則你沒東西算。

那麼就應該是聲明瞭,你缺少了基類型。

一看就知道你是初學者,把指針聲明裏的星號,和普通算式裏的間接訪問運算搞混了。

假設你的基類型是整數,用int,那麼int *p;這句話裏int的意思,就是你指針裏存的那個地址所對應的那個空間,是用來存整數的,不能存小數或字母等。

這個表達式是這麼看的:int * p;

不要這麼看:int *p;

int叫做基類型,int *叫做指向int型數據的指針類型——p裏存的是個指針,也就是地址。

那麼int **,就是以int *爲基類型的指針類型。它是指向指針的指針——它作爲一個地址,所連接的存儲空間裏,存的是指向int數據的地址。

所以int ** p[ ];就是告訴計算機:給我一連串的空間,每個空間都是裝地址的,而且這些地址是指向地址的,別給我搞成指向其他類型的了……

那麼int * (*p)[ ];想懂這句聲明,你要先明白一個概念:數組的名字,是一個指針。也就是說,數組的名字,他天然就裝着這個數組的地址(也就是它第一個元素的地址)。

比如int a[ ];int * p;這兩句話寫出來了——那麼,我可以直接用p=a;把a的值給p。

所以int * (*p)[ ];這句話裏 ,(*p)相當於一個數組名,也就是地址,而這裏的 *p,不是取p指向的值!而是在說:p是個指針!!!這個指針指向的指針,是這個數組的第一個元素的地址(也就是這個數組的指針)。

——再連上前面的int *——是說:有一連串的空間,每個空間裏都裝的都是地址,這些地址指向的是int型數據。而p,是指針,它指向另一個指針,這個指針沒有名字,但是這個沒名字的指針,是指向這個數組的——也就是與這個數組裏的第一個元素的地址相等。

我知道你不懂,那就再舉個簡單的例子。

int a[ ];int (*p)[ ];這兩句話出來了,我能不能用p=a;來給p賦a值?顯然不能,因爲a是個地址,p是個指向地址的地址,所以應該是p=&a;來把a的地址賦給p。

或者直接寫成int (*p)[ ]=&a;——這句話很有迷惑性啊!!一不留神你就把等號左邊當成個算式開始取值了——千萬時刻注意!當一個數據類型和星號共同出現時,它們的目的只有一個:告訴計算機這是指針。至於是指向啥的指針,你自己仔細。

綜上,對於這個問題自己的理解是:

int ** p[ ]:
p爲指針數組,即數組每個元素都爲指針,這些指針必須指向指針,而非指向數據。
int *(*p)[ ]:
p爲指針這個指針指向沒有名字的指針數組的指針,而數組內的元素指向int型數據。

更直觀點:

Type **[ ] 是一個數組類型,bound未知,裏面放的是Type**
Type *(*)[ ] 是一個指針類型,指向一個bound未知的數組,該數組裏放的是Type*

我知道說了這麼多,可能你一個字都沒看懂。

但沒關係,這些都是純玩兒概念的,沒什麼實用價值,屬於“貴族的娛樂”~

作者:Garvey
鏈接:https://www.zhihu.com/question/65873675/answer/237381360

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章