有關指針部分的疑惑,瀏覽到他人很有幫助的解答,引用一下並捎帶自己的理解碼一下。
如果是表達式,那麼方括號裏應該有個數字,或變量,否則你沒東西算。
那麼就應該是聲明瞭,你缺少了基類型。
一看就知道你是初學者,把指針聲明裏的星號,和普通算式裏的間接訪問運算搞混了。
假設你的基類型是整數,用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