指針函數(shù)一般是指返回指針的函數(shù);
#include <stdio.h> int* fun(int *a) { return a; } int main(int argc, char **argv) { int a = 3; printf("%d", *(fun(&a))); return 0; }
函數(shù)指針是表示指向函數(shù)開(kāi)始地址的指針:
首先要了解函數(shù)的調(diào)用過(guò)程:
#include <stdio.h> int fun(int i) { return i + 1; } int main(int argc, char **argv) { int r; //r = fun(5); r = (*fun)(5); //調(diào)用方式 printf("%d/n", r); return 0; }
函數(shù)可以用r = (*fun)(5);來(lái)調(diào)用,說(shuō)明函數(shù)名其實(shí)是一個(gè)指針,
通過(guò)(*fun)來(lái)尋址。所以我們就可以定義一個(gè)指針
#include <stdio.h> int fun(int i) { return i + 1; } int main(int argc, char **argv) { int r; int (*funP)(int); //聲明指針 //funP = fun; //給指針賦值 funP = &fun; r = funP(5); printf("%d/n", r); return 0; }
所以,給函數(shù)指針賦值也有兩種方式;
同樣,通過(guò)函數(shù)指針調(diào)用函數(shù)的方式也有兩種:
#include <stdio.h> int fun(int i) { return i + 1; } int main(int argc, char **argv) { int r; int (*funP)(int); //聲明指針 funP = fun; //給指針賦值 //r = funP(5); r = (*funP)(5); //調(diào)用 printf("%d/n", r); return 0; }
也就是說(shuō),除了聲明的地方,fun()與(*fun)()的作用是一樣的。
這樣,也就讓C語(yǔ)言容易實(shí)現(xiàn)類(lèi)似于回調(diào)函數(shù)的結(jié)構(gòu):
#include <stdio.h> int funA(int i) { return i + 1; } int funB(int i) { return i - 1; } void fun(int (*funP)(int), int i) { printf("%d/n", funP(i)); } int main(int argc, char **argv) { int (*funP)(int); //聲明指針 funP = funA; //給指針賦值 //funP = funB; //給指針賦值 fun(funP, 5); //調(diào)用 return 0; }
在fun()函數(shù)里,它做的只是在某個(gè)時(shí)候調(diào)用一個(gè)funP指針指向的函數(shù),至于是哪個(gè)函數(shù),在fun函數(shù)的定義處還無(wú)從得知;直到將funA賦給函數(shù)指針funP,funP具體要做什么功能,才得以確定。
也就是說(shuō),main函數(shù)決定fun函數(shù)需要幫它實(shí)現(xiàn)什么函數(shù)代碼,但是fun何時(shí)調(diào)用以及是否調(diào)用main給他的函數(shù),那是由fun()來(lái)決定。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注