C語(yǔ)言聲明指針小結(jié)

博客開(kāi)了這么久,都沒(méi)寫什么技術(shù)性的文章,恰好最近在看C語(yǔ)言相關(guān)的東西,學(xué)會(huì)一些關(guān)于指針聲明的小技巧,記錄一下。
言傳我也不太說(shuō)話,直接意會(huì)吧

變量指針

int *p = NULL;??//?指向 整形變量 的指針
int **p = NULL;??//?指向 整形指針變量 的指針

常量指針,常指針

const int *p = NULL;??//?指向 整形常量 的指針
int *const p = NULL;??//?指向 整形 的常指針
const int *const p = NULL;??//?指向 整形常量 的常指針

數(shù)組指針,指針數(shù)組

int *p[4] = {NULL};??//?大小為4的數(shù)組,每個(gè)元素都是指向整形變量的指針
int (*p)[4] = NULL;??//?指向 一個(gè)大小為4的整形數(shù)組 的指針,自增時(shí)每次加4 * sizeof(int)
int *(*p)[4] = NULL;??//?指向 一個(gè)大小為4的指針數(shù)組 ,該數(shù)組的每一個(gè)元素都是指向整形變量的指針
int *p[3][4] = {NULL};??//?3 * 4的二維數(shù)組,每一個(gè)元素都是指向整形變量的指針
int (*p)[3][4] = NULL;??//?指向 大小為3 * 4的二維整形數(shù)組 的指針,自增時(shí)每次加3 * 4 * sizeof(int)
int *(*p)[3][4] = NULL;??//?指向 大小為3 * 4的二維整形指針數(shù)組 的指針,該數(shù)組每一個(gè)元素都是指向整形變量的指針
int (*(*p)[3])[4] = NULL;??//?指向一個(gè)指針,這個(gè)指針又指向一個(gè)大小為3的指針數(shù)組,數(shù)組的每一個(gè)元素指向一個(gè)大小為4的整形數(shù)組
int *(*(*p)[3])[4] = NULL;??//?指向一個(gè)指針,這個(gè)指針又指向一個(gè)大小為3的指針數(shù)組,數(shù)組的每一個(gè)元素指向一個(gè)大小為4的整形指針數(shù)組

函數(shù)指針

int *p(int) = NULL;??//?有一個(gè)整形形參,返回值為整形指針的函數(shù)
int (*p)(int) = NULL;??//?指向 有一個(gè)整形形參,返回值為整形變量的函數(shù) 的函數(shù)指針
int *(*p)(int) = NULL;??//?指向 有一個(gè)整形形參,返回值為整形指針的函數(shù) 的函數(shù)指針
int *(*p)(int*) = NULL;??//?指向 有一個(gè)整形指針參數(shù),返回值是整形指針的函數(shù) 的函數(shù)指針
int *(*p)(int, int*) = NULL;??//?指向 有一個(gè)整形參數(shù),一個(gè)整形指針參數(shù),返回值是整形指針的函數(shù) 的函數(shù)指針

混合

int *(*(*(*p)(int*))[3])(int*[ ], int*) = NULL;??//?P是一個(gè)函數(shù)指針,指向一個(gè)有一個(gè)整形指針參數(shù)的函數(shù),這個(gè)函數(shù)的返回值是指向數(shù)組的指針,數(shù)組的每一個(gè)元素也是一個(gè)函數(shù)指針,指向一個(gè) 返回值為整形指針,參數(shù)為一個(gè)整形指針數(shù)組和一個(gè)整形指針 的函數(shù)


分析

稍微有點(diǎn)亂,但是,不難發(fā)現(xiàn)其中的規(guī)律。

*p表示一個(gè)指針,但是 * 符號(hào)的優(yōu)先級(jí)沒(méi)有( )和[ ]高。所以 int *p[ ] 和 int (*p)[ ] 就有一些區(qū)別了,一個(gè)是 指針數(shù)組,一個(gè)是數(shù)組指針


int *p[ ];??[ ]優(yōu)先級(jí)比*高,所以p是數(shù)組,那么把p[]用手遮住,剩下的就是數(shù)組的類型了,也就是int*,整形指針類型。


int (*p)[ ];??*p被括號(hào)括起來(lái)了,優(yōu)先級(jí)最高,所以p是指針,用手把*p遮住,剩下的就是指針?biāo)赶虻念愋土?,也就是int [ ],整形數(shù)組類型。


那么,同樣的方法,可以分析一下其他的聲明。如int *p(int);和int (*p)(int);


int *p(int); ?乍一看像一個(gè)指針,但是這是一個(gè)函數(shù)聲明,( )優(yōu)先級(jí)比[ ]高,所以p是一個(gè)函數(shù),所以把p(int)遮住,剩下int*,所以p是一個(gè)參數(shù)為整形,返回值為整形指針的函數(shù)。


int (*p)(int); ?這個(gè)就是一個(gè)指針聲明了,p是指針,遮住(*p),剩下int ? (int),所以p指向 ? 一個(gè)參數(shù)為整形,返回值為整形? 的函數(shù)。



方法就是這么個(gè)方法,其他分析自己多思考吧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容