扼要解釋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()來決議。