1. 函數指針
c++
通常的函數指針能夠這麼定義:
int(*func)(int,int);
表示一個指向含有兩個int參數而且返回值是int形式的任何一個函數指針. 假如存在這樣的一個函數:
int add2(int x,int y)
{
return x+y;
}
那麼在實際使用指針func時能夠這樣實現:
func=&add2; //指針賦值,或者func=add2; add2與&add2意義相同
printf("func(3,4)=%d\n",func(3,4));
typedef int(*FUN)(int,int);
FUN func=&add2;
func();
其實在結構體中,也能夠像通常變量同樣,包含函數指針變量.下面是一種簡單的實現.
#include "stdio.h"
struct DEMO
{
int x,y;
int (*func)(int,int); //函數指針
};
int add2(int x,int y)
{
return x+y;
}
void main()
{
struct DEMO demo;
demo.func=&add2; //結構體函數指針賦值
printf("func(3,4)=%d\n",demo.func(3,4));
}
上面的文件保存爲mytest.c,在VC6.0和gcc4中編譯經過.
其實在結構體中,也能夠像通常變量同樣,包含函數指針變量.下面是一種簡單的實現.
#include "stdio.h"
struct DEMO
{
int x,y;
int (*func)(int,int); //函數指針
};
int add2(int x,int y)
{
return x+y;
}
void main()
{
struct DEMO demo;
demo.func=&add2; //結構體函數指針賦值
printf("func(3,4)=%d\n",demo.func(3,4));
}
上面的文件保存爲mytest.c,在VC6.0和gcc4中編譯經過.
既然C++在介紹類的時候說過,類是取代結構體的.可見結構體的功能並不是咱們平時用到的這麼簡單,沒有太多人知道結構體中也能夠有本身的函數成員.
舉個例子:
#include "stdio.h"
struct DEMO
{
int m;
{
this->m=k;
printf("after init,m=%d\n",m);
}
{
printf("function of struct.\n");
}
};
{
struct DEMO demo(33);
demo.func();
}
after init,m=33
function of struct.
========================================
函數指針的說明:
已知函數指針定義聲明 float (*h)();
怎麼理解語句? (*(void (*)())0)();
這是一個C語句,表示(*p)(); 其中p指向0, 0被強制轉換成(void (*)())格式。
或者用typedef將上面式子分紅兩步:
typedef void (*pFUNC)(); //pFUNC表示一種函數指針類型,這樣的函數式void fun()形式.
(*(pFunc)0)();
signal函數原型: void (*signal(int signo,void (*func)(int)))(int);
其第二個參數func是一個void型函數指針(該函數參數爲int),而且返回一個void型函數指針(該函數參數爲int),簡化這個定義, 能夠typedef void Sigfunc(int); 而後signal函數原形寫爲 Sigfunc* signal(int,Sigfunc*);
三個常量用於替代這樣的指針。定義以下:
#define SIG_ERR (void (*)())-1
#define SIG_DFL (void (*)())0
#define SIG_IGN (void (*)())1
if(signal(SIGUSR1,sig_func)==SIG_ERR)
err_sys("can't catch SIGUSR1");編程
事實上,爲了代碼的移植考慮,通常使用typedef定義函數指針類型.
小程序
2.結構體中包含函數指針
函數
3.結構體中的函數
this
DEMO(int k) //構造函數
spa
void func()//通常函數
unix
void main()
指針
保存爲mytest1.c , VC6.0和gcc編譯都會出錯. 這可能說明標準C是不支持結構體包括函數成員形式的(由於後綴.c使得VC或gcc選擇c編譯器). 可是若是將文件後綴改成.cpp(也就是選擇c++編譯),就再也不有錯誤了,獲得結果:
對象
也就是說,在C++中容許結構體包含函數成員,而標準C不支持. 進一步發現,c++中甚至容許結構體中含有構造函數、重載、public/private等等.這樣看來,結構體真的與類愈來愈靠近類似了!原型
C++擴充告終構體的功能。但C++中爲了介紹面向對象的類,卻淡化了一樣精彩的結構體。當咱們寫一些小程序而以爲沒有必要去構造類的時候,選擇結構體確實會方便不少.
對於這一點,在unix編程signal方面用到過,以下:
函數應用
if(signal(SIGUSR1,sig_func)==SIG_ERR)
err_sys("can't catch SIGUSR1");