c語言之解釋複雜指標

zw1996發表於2018-03-10

int p;一個普通的int型別變數p

int p;是從右往左則p與*結合 p為指標變數 指向int型別指標變數

int p[3];p是一個有三個元素 的陣列 元素型別為int型別

int *p[3];
因為[]優先順序大於* 則p先與[]結合 則p為一個有三個元素的陣列
再與結合 從右到左 p[3]與*結合 表示是指標,則表示p陣列的三個元素都是指標
最後int 表示p陣列的三個元素都是指標並指向的是int型別

int (*p)[3];
因為()所以p先於*結合 表示p是一個指標
然後p指標再與[]結合表示p是一個指向一個三個元素的陣列的指標
最後int 表示p指標指向一個有三個元素的陣列 陣列元素為int型別

int **p;二級指標
p與最右邊的*結合 表示p是一個指標
p再與另外一個結合表示*p也是一個指標
最後與int結合 表示*p是一個指向int型別的指標而p就是一個指向int型別的指標的指標。稱為二級指標

int p(int);
p與()結合,說明p首先是個函式,
然後再與int結合,說明函式的返回值是int變數。

int (*p)(int);
因為()則p先於*結合 表示p是一個指標
再與(int)結合表示p是一個指向一個int形參的函式的指標
再與int結合表示p是一個指向int形參並返回in型別的函式的指標

int *(*p(int))[3];
()優先於*:則p先於(int)結合表示 p是一個int形參的函式
再與*結合 表示p是一個,int形參,返回指標,的函式
因為[]優先於*則先於[3]結合表示
p是一個,int形參,返回一個指向一個有三個元素陣列的指標,的函式
再又與*結合
我們先把之前搞定的有個字母表示
int * A【3】;
那麼就意味著 ,與*結合就表示 陣列的型別是指標型別
再與int結合 就表示陣列元素的型別是指向int型別的指標變數

最後回到p
p是一個函式 一個int形參的 返回一個指標 (指向陣列元素為int型指標的陣列)

int (*(*p)(int))(int);
*p表示p是一個指標
再與(int)結合 表示p是一個指向函式的指標 函式的形參為int型
再與*結合表示 p指向的這個函式的返回型別是指標型別
再與(int)結合表示這個函式返回的指標指向一個int形參的函式型別
再與int結合 表示這個函式返回指標指向的函式的返回值是int型別

總結
讀懂就是在瞭解一些優先順序的的情況下一步一步解刨
【】()> .
注意當分析到很複雜的時候可以採用分開的方法分析
例如 函式 可以從返回值再重新入手,不一定要還是要走變數讀起
陣列可以從陣列元素的型別入手
分開分析完後再連到一起寫出p變數的解釋

相關文章