指標是c和c++中程式設計最複雜也是最有技巧的部分,但對於新手來說,指標無疑是最致命的,讓很多人望而退步。不過很多事情都是從陌生開始,然後漸漸熟悉起來的,就像交朋友一樣,得花點時間去培養感情才行。不過指標這位朋友可比較高冷,只花一點點時間恐怕不夠,得多學多練多接觸,它才會給你展示它熱情的一面。
好了,廢話不多說,相信很多人在識別指標型別的時候,經常會出錯,像void * p;這樣的指標自然好認,但是像int (*fp)(int*);或者float (*(*fp2)(int,int,float))(int);這樣的指標可能就沒那麼好認了。其實不用怕,都是有規(套)則(路)的。
一般的解決辦法是從中間開始向外擴充套件,從中間開始即從變數名開始,拿float (*(*fp2)(int,int,float))(int);舉例子,就是從fp2開始,向外擴充套件的意思是先看右邊最近項,fp2的右邊是右括號,沒有意義,然後注意左邊,星號表示fp2是乙個指標,再看右邊,是乙個參數列,說明fp是乙個指向函式的指標,且這個函式有三個引數,分別是int、int、float型別,再看左邊,星號表示該函式返回值為指標,再看右邊,右括號,沒有意義,看左邊,左括號,無意義,看右邊,引數列表,表明返回的指標是指向函式的指標,且函式有乙個int型引數,最後float表示函式返回值為float*型,所以總結一下便是,fp2是乙個指向函式的指標,該函式接受三個引數(int,int,float),並且返回乙個指向函式的指標,該函式接受乙個整形引數並返回乙個float*值。
看起來很複雜,解讀起來也很麻煩,看到以後想打作者的心都有了,但沒辦法,當需要用到的時候還是得硬著頭皮上。
最後做兩個小練習:
void * (*(*fp1)(int))[10];
double (*(*(*fp2)())[10])();
解答:fp1是乙個指向函式的指標,該函式接受乙個整形引數並且返回乙個指向10個void指標陣列的指標
fp2是乙個指向函式的指標,該函式無引數,且返回乙個指向含有10個指向函式指標陣列的指標,這些函式不接受引數且返回double值。
識別C 指標型別的正確姿勢
昨天在看譚浩強的c 的時候,覺得指標這塊雖然分塊闡述 關於指標定義 指標變數 陣列與指標 字串與指標 函式與指標等有所闡述,但在分類以及如何辨別方面沒有乙個清晰的方法和思路。為了對這一塊內容有更深的理解,整理一下關於指標辨認的方法。一般情況下,指標結合性是從右到左的。從這點來看,我們首先提取出要辨認...
正確規避野指標姿勢
新手必看,大神繞道勿噴。謝謝!break在前幾天寫 時,在windows上完美執行,但是放到android上執行時發現有記憶體洩漏,導致閃退。這個錯誤源於break寫 時不小心使用了野指標。於是寫下這篇文章加深印象,以防以後再犯。看下面一段 class a void main ps 這sb 是誰寫的...
C 函式指標與指標識別
1 函式名與函式指標 函式名對應於該函式執行 的入口位址。通過取位址運算子 也可以取得函式的入口位址。指向函式的指標可以作為函式的引數傳遞。定義方式如下 返回型別 指標變數名 參數列 由於乙個函式不能以函式作為引數,所以當乙個函式需要將函式作為引數時必須借用指向函式的指標 也可以用包含該函式的類物件...