1、指針函數(shù):是指帶指針的函數(shù),即本質(zhì)是一個函數(shù)。函數(shù)返回類型是某一類型的指針 類型標(biāo)識符 *函數(shù)名(參數(shù)表) int *fun(x,y); 首先它是一個函數(shù),只不過這個函數(shù)的返回值是一個地址值。函數(shù)返回值必須用同一類型的指針變量來接收。也就是說指針函數(shù)一定有函數(shù)返回值,而且,在主調(diào)函數(shù)中,函數(shù)返回值必須賦給同類型的指針變量。 (1)、定義指針函數(shù)的一般形式如下: 類型名 *函數(shù)名(參數(shù)); 例如: int *fun(int a); int *p; p =fun(a); 2、函數(shù)指針:函數(shù)指針是指向函數(shù)的指針變量,即本質(zhì)是一個指針變量。 (1)、什么是函數(shù)指針 如果在程序中定義了一個函數(shù),在編譯時,編譯系統(tǒng)為函數(shù)代碼分配了一段存儲空間,這段存儲空間的起始地址(又稱為入口地址)稱為這個函數(shù)的指針。 可以定義一個指向函數(shù)的指針變量,用來存放某一函數(shù)的起始地址,這就意味著此指針變量指向該函數(shù)。例如: int (*p) (int ,int ); //定義p是一個指向函數(shù)的指針變量, 它可以指向函數(shù)的類型為整型且有兩個整型參數(shù)的函數(shù)。 p的類型是int (*)(int ,int )表示。 (2)、用函數(shù)的指針變量調(diào)用函數(shù) 如果想調(diào)用一個函數(shù),除了可以通過函數(shù)名調(diào)用以外,還可以通過指向函數(shù)的指針變量來調(diào)用該函數(shù)。 例子1:用函數(shù)求整數(shù)a和b中的大者。 (1)、通過函數(shù)名調(diào)用函數(shù) /************************* (1)、通過函數(shù)名調(diào)用函數(shù) *************************/ #include <stdio.h> int main() { int max(int, int);//函數(shù)的聲明 int a, b, c; printf("Pleade input 2 integer numbers:"); scanf_s("%d,%d", &a, &b); c = max(a, b);//通過函數(shù)名調(diào)用max函數(shù) printf("a=%d\nb=%d\nmax=%d\n", a, b, c); getchar(); return 0; } int max(int x,int y)//定義max函數(shù) { int z; if (x > y) z = x; else z = y; return (z); } (2)、通過指針變量訪問它所指向的函數(shù) /************************* (2)、通過指針變量訪問它所指向的函數(shù) *************************/ #include <stdio.h> int main() { int max(int, int);//函數(shù)的聲明 int (*p)(int,int);//定義指向函數(shù)的指針變量p int a, b, c; p = max;//使p指向max函數(shù) printf("Pleade input 2 integer numbers:"); scanf_s("%d,%d", &a, &b); c =(*p)(a, b); //通過指針變量調(diào)用max函數(shù) printf("a=%d\nb=%d\nmax=%d\n", a, b, c); system("pause"); return 0; } int max(int x,int y)//定義max函數(shù) { int z; if (x > y) z = x; else z = y; return (z); } 上面的兩個程序的運行結(jié)果一樣。 注意: 對于“int (*p)(int ,int);”,*p兩側(cè)的括號不能省略,表示p先與*結(jié)合,是指針變量,然后再與后面的()結(jié)合,()表示的是函數(shù),即該指針變量不是指向一般的變量,而是指向函數(shù)。 如果寫成“int * p(int ,int );”,由于()優(yōu)先級高于*,它相當(dāng)于“int *(p(int,int));”就成了聲明一個p函數(shù)了(這個函數(shù)的返回值是指向整型變量的指針)。 “p=max;”的作用是將函數(shù)max的入口地址賦給指針變量p。和數(shù)組名代表數(shù)組首元素地址類似,函數(shù)名代表函數(shù)的入口地址。這樣p就是指向函數(shù)max的指針變量,此時p和max都指向函數(shù)的開頭。調(diào)用*p就是調(diào)用max函數(shù)。 (3)、怎樣定義和使用指向函數(shù)的指針變量 定義指向函數(shù)的指針變量的一般形式如下: 類型名 (*指針變量名)(函數(shù)參數(shù)列表); 注意: 1、定義指向函數(shù)的指針變量,并不意味著這個指針變量可以指向任何函數(shù),它只能指向定義時指定的類型的函數(shù)。如:“int (*p) (int ,int );”表示指針變量p只能指向函數(shù)返回值為整型且有兩個整型參數(shù)的函數(shù)。 2、如果要用指針調(diào)用函數(shù),必須先使指針變量指向該函數(shù)。如:p = max; 3、在給函數(shù)指針變量賦值時,只需給出函數(shù)名而不必給出參數(shù),如: p = max;//將函數(shù)的入口地址賦給p 如果寫成: p = max(a,b); 就錯了,因為p=max(a,b)是將調(diào)用max函數(shù)所得到的函數(shù)值賦給p,而不是將函數(shù)的入口地址賦給p。 4、用函數(shù)指針變量調(diào)用函數(shù)時,只需將(*p)代替函數(shù)名即可(p為指針變量名,存放的是函數(shù)的入口地址),在(*p)之后的()中根據(jù)需要寫上實參。例如: c =(*p) (a,b); 5、對指向函數(shù)的指針變量不能進(jìn)行算術(shù)運算,如:p+n、p++、p--等運算是沒有意義的。 6、用函數(shù)名調(diào)用函數(shù),只能調(diào)用所指定的一個函數(shù),而通過指針變量調(diào)用函數(shù)則比較靈活,可以根據(jù)不同的情況先后調(diào)用不同的函數(shù)。 |
|