首先明白兩個概念:
函數指針:一個指向函數的指針,這個指針獲得對應的函數名的地址。比如說整型指針,我們知道是一個指向整型數據的指針,那么函數指針顧名思義就是一個指向函數的指針,
聲明一個整型變量這樣寫: int a;
聲明一個整型指針這樣寫:int * a; //即變量名加個*號
聲明一個返回值為整型的函數這樣寫: int Swap(int*, int*);
聲明一個指向返回值為整型的函數的指針這樣寫:int (*Swap)(int*, int*);//其中這個int就是所指向的函數的返回值類型,如果這個指向的函數的返回值是個整型指針,那么就可以寫成 int* (*Swap)(int*, int* )
指針函數:一個返回值為指針的函數,比如說整型函數是值返回值為整型的函數,那么指針函數的意思就是返回值是指針,
聲明一個返回值為整型的函數這樣寫: int a(int, int);
聲明一個返回值為整型指針的函數這樣寫:int * Swap(int*, int*); 把后面的Swap(int*, int*)當成也給變量p ,也就成了int* p這種常見的形式了。
一個指向指針函數的函數指針:
首先分析下,這個描述其實描述的還是函數指針,這個指針指向一個函數,而且函數的返回值是個指針,看起來有點繞:
1. 這個指針的組成部分有: 指向函數的返回值類型 (* 指針變量)(函數的形參表)
2. 即寫成 , int * (* p )(int*, int*)
3. 寫漂亮點就是 int *(*p)(int*, int*)
1 #include<stdio.h> 2 //下面定義一個指針函數 3 int* Swap(int *a, int *b){ 4 5 int temp; 6 temp = *a; 7 *a = *b; 8 *b = temp; 9 return a; 10 } 11 //定義某個函數的函數指針,首先必須要申明這個指針指向一個返回值是什么樣的函數,int* 這是函數的返回類型, 12 //(*pSwap)是聲明一個指針,所以int* (*pSwap)(int*,int*) 是一個指針函數的函數指針。 13 int main(){ 14 int* (*pSwap) (int *, int *);//下面定義一個函數指針,這是一個指針,指向一個返回值為int *的函數 15 int a = 99, b= 100, c= 0; 16 c=*Swap(&a,&b); 17 pSwap=Swap;//得到這個函數的地址 18 printf("返回的數值是,a原來是99,現在是: %d\n",c); 19 printf("返回的數值是,a原來是99,現在是: %d\n",*pSwap(&a, &b)); 20 return 0; 21 }