C語言指標3-函數指標

來源:互聯網
上載者:User

函數指標

是一個指向函數的指標,可以如下定義:

int (*pfunc)(int, int);

對這條語句的解釋是:

先解釋(*pfunc),所以pfunc首先是一個指標;

再解釋(int, int),pfunc指向一個函數,該函數的參數有兩個,都是整形;

最後是傳回值。

因此,如果定義了一個函數int max(int a, int b),我們就可以這樣使用函數指標了:

pfunc = max; // 注意二者的傳回型別,需要一致


函數指標與指標函數是不一樣的,後者是一個函數,其傳回值是一個指標,比如
char * index( const char *s, int
c);

int (*max)(int a, int b); // 函數指標

int *max(int a, int b); // 指標函數

下面給出函數指標使用的一些代碼:

(1)

int min(int a, int b){return a > b ? b : a;}int max(int a, int b){return a > b ? a : b;}int main(){int a = 12;int b = 34;int (*pfunc)(int, int);// 定義一個函數指標pfunc = min;printf("min=%d/n", pfunc(a, b));pfunc = max;printf("max=%d/n", pfunc(a, b));int (*p[2])(int, int);p[0] = min;p[1] = max;printf("min=%d/n", p[0](a, b));printf("max=%d/n", p[1](a, b));#define abc minprintf("min=%d/n", abc(a, b));#define efg maxprintf("max=%d/n", efg(a, b));return 0;}

int (*p[2])(int, int)是一個函數指標數組。函數指標感覺和#define相似,見上面的代碼中的#define部分。

(2)

typedef struct point{double x;double y;}Point;int cmp1(void *a, void *b){int *c = (int *)a;int *d = (int *)b;return *c - *d;}int cmp2(void *a, void *b){double *c = (double *)a;double *d = (double *)b;double e = *c - *d;if (e > 0)return 1;else if (e < 0)return -1;else return 0;}int cmp3(void *a, void *b){return strcmp((char *)a, (char *)b);}int cmp4(void *a, void *b){Point *c = (Point *)a;Point *d = (Point *)b;double e = c->x - d->x;if (e > 0)return 1;else if (e < 0)return -1;else return 0;}void test(void *a, int n, int size, int (*p)(void *, void *)){void *p1 = a;void *p2 = a + size;// do somethingprintf("%d/n", p(p1, p2));}int main(){int c[2];c[0] = 12;c[1] = 34;test(c, 2, sizeof(int), cmp1);double d[2];d[0] = 1.2;d[1] = 3.4;test(d, 2, sizeof(double), cmp2);char s[2][16] = {"xiao", "she"};test(s, 2, sizeof(s[0]), cmp3);Point pt[2];pt[0].x = 1.8;pt[0].y = 1.3;pt[1].x = 1.4;pt[1].y = 1.5;test(pt, 2, sizeof(Point), cmp4);return 0;}例子(2)中的test函數其中一個參數是一個函數指標,分別調用不同的比較函數,以處理不同類型的資料。

和qsort是不是很相似?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.