最近在看《c陷阱與缺陷》這本書 第一張就介紹了函數聲明,才知道函數指針可以聲明,怎么樣聲明。
首先 typedef 書上的用法就是,用聲明表達式的標識符作為其標識符類型對應的別名。
例如
typedef int a;
/*
此時a就是int 類型的別名
*/
typedef char fuc[10];
/*
fuc 代表一個長度為10的字符數組名(字符指針)類型
*/
typedef void (*fp)(int);
/*
fp 代表一個函數指針,該指針指向的函數為 返回值為void,參數為一int類型的函數;
*/
其中書上有一個例子
一個signal函數, signal函數接受兩個參數一個代表需要"被捕獲"的特定signal的整數值,另一個是指向用戶提供的函數指針,該函數用於處理“捕獲到”的特定signal,返回值類型為void ,signal函數返回值為函數指針該函數指針類型與第二個參數相同。
如果要直接聲明
void (*signal(int ,void(*)(int)))(int);
大部分程序員都這段代碼就很費勁了。
如果用typedef就很容易明白了
typedef void (*fp)(int);
fp signal(int,fp);
最后幾個c函數的特殊方面
1.func是個函數名,func的值是函數的地址,&func的值也為函數地址;(*func)(something)為調用對應函數,(*(&func))(something)調用對應的函數,但一般都傾向於用二種寫法,符合普通指針的定義。
2.任何變量使用前都需要聲明,包括函數。
3. c語言要求:在函數調用時即使不帶參數,也應該包括參數列表,因此如果f是一個函數。
f();
是一個函數調用語句,而
f;
卻是一個什么都不做的語句,更精確的說,這個語句計算函數f的地址,卻並不調用該函數。