扼要解釋C說話中指針函數與函數指針的差別。本站提示廣大學習愛好者:(扼要解釋C說話中指針函數與函數指針的差別)文章只能為提供參考,不一定能成為您想要的結果。以下是扼要解釋C說話中指針函數與函數指針的差別正文
指針函數普通是指前往指針的函數;
#include <stdio.h> int* fun(int *a) { return a; } int main(int argc, char **argv) { int a = 3; printf("%d", *(fun(&a))); return 0; }
函數指針是表現指向函數開端地址的指針:
起首要懂得函數的挪用進程:
#include <stdio.h> int fun(int i) { return i + 1; } int main(int argc, char **argv) { int r; //r = fun(5); r = (*fun)(5); //挪用方法 printf("%d\n", r); return 0; }
函數可以用r = (*fun)(5);來挪用,解釋函數名實際上是一個指針,
經由過程(*fun)來尋址。所以我們便可以界說一個指針
#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; }
所以,給函數指針賦值也有兩種方法;
異樣,經由過程函數指針挪用函數的方法也有兩種:
#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); //挪用 printf("%d\n", r); return 0; }
也就是說,除聲明的處所,fun()與(*fun)()的感化是一樣的。
如許,也就讓C說話輕易完成相似於回調函數的構造:
#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); //挪用 return 0; }
在fun()函數裡,它做的只是在某個時刻挪用一個funP指針指向的函數,至因而哪一個函數,在fun函數的界說處還無從得知;直到將funA賦給函數指針funP,funP詳細要做甚麼功效,才得以肯定。
也就是說,main函數決議fun函數須要幫它完成甚麼函數代碼,然則fun什麼時候挪用和能否挪用main給他的函數,那是由fun()來決議。