一、使用typedef聲明新類型名
C語言支援一種叫做typedef的機制,它允許你為各種資料類型定義新名字。typedef聲明的寫法和普通的聲明基本相同,隻是吧typedef這個關鍵字出現在聲明的前面。例如,下面這個聲明:
<code>char</code> <code>*ptr_to_char;</code>
把變量ptr_to_char聲明為一個指向字元的指針。但是,在你添加關鍵字typedef後,聲明變為:
<code>typedef</code> <code>char</code> <code>*ptr_to_char;</code>
這個聲明把辨別符ptr_to_char作為指向字元的指針類型的新名字。你可以像使用任何預定義名字一樣在下面的聲明中使用這個新名字。例如:
<code>ptr_to_char a;</code>
聲明a是一個指向字元的指針。
使用typedef聲明類型可以減少使聲明變得又臭又長的危險,尤其時那些複雜的聲明。而且,如果你以後覺得應該修改程式所使用的一些資料的類型時,修改一個typedef聲明比修改程式中與這種類型有關的所有變量(和函數)的所有聲明要容易得多。
<code>【提示】</code>
<code> </code><code>你應該使用typedef而不是#define來建立新的類型名,因為後者無法正确的處理指針類型。例如:</code>
<code> </code><code>#define d_ptr_to_char char *</code>
<code> </code><code>d_ptr_to_char a,b;</code>
<code>正确地聲明了a,但是b卻被聲明為一個字元。在定義更為複雜的類型名字是,如函數指針或指向數組的指針,使用typedef更為合适。</code>
摘自:《C和指針》(3.3 typedef)
二、使用typedef聲明函數指針
【形式】:typedef 傳回類型(*新類型)(參數表)
<code>typedef</code> <code>char</code> <code>(*PTRFUN)(</code><code>int</code><code>); </code>
<code>PTRFUN pFun; </code>
<code>char</code> <code>glFun(</code><code>int</code> <code>a){ </code><code>return</code><code>;} </code>
<code>void</code> <code>main() </code>
<code>{ </code>
<code> </code><code>pFun = glFun; </code>
<code> </code><code>(*pFun)(2); </code>
<code>}</code>
typedef的功能是定義新的類型。第一句就是定義了一種PTRFUN的類型,并定義這種類型為指向某種函數的指針,這種函數以一個int為參數并傳回char類型。後面就可以像使用int,char一樣使用PTRFUN了。
【示例】
<code>#include <stdio.h></code>
<code>#include <assert.h></code>
<code>typedef</code> <code>int</code> <code>(*FP_CALC)(</code><code>int</code><code>,</code><code>int</code><code>);</code><code>//定義一個函數指針類型</code>
<code>int</code> <code>add(</code><code>int</code> <code>a, </code><code>int</code> <code>b)</code>
<code>{</code>
<code> </code><code>return</code> <code>a + b;</code>
<code>int</code> <code>sub(</code><code>int</code> <code>a, </code><code>int</code> <code>b)</code>
<code> </code><code>return</code> <code>a - b;</code>
<code>int</code> <code>mul(</code><code>int</code> <code>a, </code><code>int</code> <code>b)</code>
<code> </code><code>return</code> <code>a * b;</code>
<code>int</code> <code>div</code><code>(</code><code>int</code> <code>a, </code><code>int</code> <code>b)</code>
<code> </code><code>return</code> <code>b ? a/b : -1;</code>
<code>//定義一個函數,參數為op,傳回一個指針,該指針類型為擁有兩個int參數、</code>
<code>//傳回類型為int的函數指針。它的作用是根據操作符傳回相應函數的位址</code>
<code>FP_CALC calc_func(</code><code>char</code> <code>op)</code>
<code> </code><code>switch</code><code>( op )</code>
<code> </code><code>{</code>
<code> </code><code>case</code> <code>'+'</code><code>:</code>
<code> </code><code>return</code> <code>add;</code>
<code> </code><code>case</code> <code>'-'</code><code>:</code>
<code> </code><code>return</code> <code>sub;</code>
<code> </code><code>case</code> <code>'*'</code><code>:</code>
<code> </code><code>return</code> <code>mul;</code>
<code> </code><code>case</code> <code>'/'</code><code>:</code>
<code> </code><code>return</code> <code>div</code><code>;</code>
<code> </code><code>default</code><code>:</code>
<code> </code><code>return</code> <code>NULL;</code>
<code> </code><code>}</code>
<code> </code>
<code> </code><code>return</code> <code>NULL;</code>
<code>//最終使用者直接調用的函數,該函數接收兩個int整數,</code>
<code>//和一個算術運算符,傳回兩數的運算結果</code>
<code>int</code> <code>calc(</code><code>int</code> <code>a, </code><code>int</code> <code>b, </code><code>char</code> <code>op)</code>
<code> </code><code>FP_CALC fp = calc_func(op);</code>
<code> </code><code>if</code><code>(fp)</code>
<code> </code><code>return</code> <code>fp(a,b);</code>
<code> </code><code>else</code>
<code> </code><code>return</code> <code>-1;</code>
<code>void</code> <code>main()</code>
<code> </code><code>int</code> <code>a = 100, b = 20;</code>
<code> </code><code>printf</code><code>(</code><code>"calc(%d, %d, %c) = %d\n"</code><code>, a, b, </code><code>'+'</code><code>, calc(a, b, </code><code>'+'</code><code>));</code>
<code> </code><code>printf</code><code>(</code><code>"calc(%d, %d, %c) = %d\n"</code><code>, a, b, </code><code>'-'</code><code>, calc(a, b, </code><code>'-'</code><code>)); </code>
<code> </code><code>printf</code><code>(</code><code>"calc(%d, %d, %c) = %d\n"</code><code>, a, b, </code><code>'*'</code><code>, calc(a, b, </code><code>'*'</code><code>)); </code>
<code> </code><code>printf</code><code>(</code><code>"calc(%d, %d, %c) = %d\n"</code><code>, a, b, </code><code>'/'</code><code>, calc(a, b, </code><code>'/'</code><code>)); </code>
*** walker ***
本文轉自walker snapshot部落格51CTO部落格,原文連結http://blog.51cto.com/walkerqt/1672870如需轉載請自行聯系原作者
RQSLT