資源描述:
《typedef定義的函數指針》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫。
1、再談typedef(重點為函數指針)有種很方便的寫法。typedefint*p;ppointer;這時直接把pointer帶入原式中,取代p然后去掉typedef,得到的結果就是int*pointer;哈哈,這樣直接替換就很直觀多了。C語言語法簡單,但內涵卻博大精深;如果在學習時只是止步于表面,那么往往后期會遇到很多困難。typedef是C語言中一個很好用的工具,大量存在于已有代碼中,特別值得一提的是:C++標準庫實現中更是對typedef有著大量的使用。但很多初學者對其的理解僅局限于:typedef用來定義一個已有類型的"別名(alias)"。正是因為有了這樣的理解,才有了后來初學者在ty
2、pedefintmyint和typedefmyintint之間的猶豫不決。很多國內大學的C語言課之授課老師也都是如是說的,或者老師講的不夠透徹,導致學生們都是如是理解的。我這里想結合C語言標準文檔以及一些代碼實例,也說說typedef。int*p;這樣的代碼是C語言中最最基礎的一個語句了,大家都知道這個語句聲明了一個變量p,其類型是指向整型的指針(pointertoint);如果在這個聲明的前面加上一個typedef后,整個語義(semantics)又會是如何改變的呢?typedefint*p;我們先來看看C99標準中關于typedef是如何詮釋的?C99標準中這樣一小段精辟的描述:"Ina
3、declarationwhosestorage-classspecifieristypedef,eachdeclaratordefinesanidentifiertobeatypedefnamethatdenotesthetypespecifiedfortheidentifierinthewaydescribedinxx"。參照這段描述,并拿typedefint*p作為例子來理解:在一個聲明中,如果有存儲類說明符typedef的修飾,標識符p將被定義為了一個typedefname,這個typedefname表示(denotes)一個類型,什么類型呢?就是int*p這個聲明(declarato
4、r)中標識符(indentifier)p的類型(int*)。再比對一下兩個聲明:int*p;typedefint*p;是不是有點"茅舍頓開"的感覺,int*p中,p是一個變量,其類型為pointertoint;在int*p前面增加一個typedef后,p變?yōu)橐粋€typedef-name,這個typedef-name所表示的類型就是int*p聲明式中p的類型(int*)。說句白話,typedef讓p去除了普通變量的身份,搖身一變,變成了p的類型的一個typedef-name了。為了鞏固上面的理解,我們再來看看"C語言參考手冊(C:AReferenceManual)"中的說法:任何declara
5、tor(如typedefint*p)中的indentifier(如p)定義為typedef-name,其(指代p)表示的類型是declarator為正常變量聲明(指代int*p)的那個標識符(指代p)的類型(int*)。有些繞嘴,不過有例子支撐:[例1]typedefdoubleMYDOUBLE;分析:去掉typedef,得到正常變量聲明=>doubleMYDOUBLE;變量MYDOUBLE的類型為double;=>"typedefdoubleMYDOUBLE"中MYDOUBLE是類型double的一個typedef-name。MYDOUBLEd;<=>d是一個double類型的變量[例2]
6、typedefdouble*Dp;分析:去掉typedef,得到正常變量聲明=>double*Dp;變量Dp的類型為double*,即pointertodouble;=>"typedefdouble*Dp"中Dp是類型double*的一個typedef-name。Dpdptr;<=>dptr是一個pointertodouble的變量[例3]typedefint*Func(int);分析:去掉typedef,得到正常變量聲明=>int*Func(int);變量Func的類型為一個函數標識符,該函數返回值類型為int*,參數類型為int;=>"typedefint*Func(int)"中Func
7、是函數類型(函數返回值類型為int*,參數類型為int)的一個typedef-name。Func*fptr;<=>fptr是一個pointertofunctionwithoneintparameter,returningapointertointFuncf;這樣的聲明意義就不大了。[例4]typedefint(*PFunc)(int);分析:去掉typedef,得到正常變量聲明=>int(*PFunc)(in