重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
函數指針告訴CPU下一步需要執行哪里的代碼的指針, 一數組十分相像.
細河網站制作公司哪家好,找創新互聯公司!從網頁設計、網站建設、微信開發、APP開發、成都響應式網站建設公司等網站項目制作,到程序開發,運營維護。創新互聯公司于2013年創立到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選創新互聯公司。
#include?stdio.h
void?function(int?i,?double?d)????//一個函數的聲明
{
printf("函數運行,?%d,?%lf\n",?i,?d);
}
void?AnotherFunction(int?i,?double?d)????//另外一個函數聲明
{
printf("又一個函數運行,?%d,?%lf\n",?i,?d);
}
int?main()
{
void?(*pFun)(int,?double);????//定義了一個函數指針
int?(*p)(int?,?double);????//用于調試的函數指針
pFun?=?function;????//讓這個函數指針指向第一個函數
pFun(10,?10.101);????//通過這個函數指針來調用第一個函數
pFun?=?AnotherFunction;????//讓這個函數指針指向第二個函數
pFun(20,?20.202);????//通過這個函數指針來調用第二個函數
//若將以下代碼取消注釋,?就會產生錯誤
/*
p?=?function;
p?=?AnotherFunction;
//原因很簡單,?因為p是必須指向一個返回值為int,?第一個參數為int,?第二個參數為double的函數,?但是在此代碼中定義的函數返回值是void
*/
//這個實驗中,?直接用函數名來賦值了,?是因為函數名其實就是這個函數的指針
//而在平常調用函數時,?都要加上(),?如:printf("");
//這里,?"()"就相當于'*'(就是取值運算符),?printf是函數指針,?就相當于是數組名,?即數組的首地址
return?0;
}
使用scanf時注意加取地址符號:int arrin(int *a)
{int i,n;brdobrscanf("%d",n);brwhile(n1||n30) ;/ppfor(i=0;in;i++)brstrong{ scanf("%d",a[i]);/strong/pp}
return n;
}
int fun(int *a,int x, int n)
{int i;brfor(i=0;in;i++)br{ if (a[i]==x )brreturn i;}
return -1;
}
main()
{ int a[30],x,n,c;
scanf("%d",x);
n=arrin(a);
c=fun(a,x,n);
if (c==-1)
{printf("no");br}
else
printf("x=%d c=%d",x,c);
//getch();}
函數指針是指向函數的指針變量。 因而“函數指針”本身首先應是指針變量,只不過該指針變量指向函數。這正如用指針變量可指向整型變量、字符型、數組一樣,這里是指向函數。
函數指針有兩個用途:調用函數和做函數的參數。
函數指針的聲明方法為:
返回值類型 ( *?指針變量名) ([形參列表]);
如:
int func(int x); /* 聲明一個函數 */
int (*f) (int x); /* 聲明一個函數指針 */
f=func; /* 將func函數的首地址賦給指針f */
或者使用下面的方法將函數地址賦給函數指針:
f = func;
賦值時函數func不帶括號,也不帶參數,由于func代表函數的首地址,因此經過賦值以后,指針f就指向函數func(x)的代碼的首地址。
下面的程序說明了函數指針調用函數的方法:
#includestdio.h
int?max(int?x,int?y){return?(xy??x:y);}
int?main()
{
int?(*ptr)(int,?int);
int?a,?b,?c;
ptr?=?max;
scanf("%d%d",?a,?b);
c?=?(*ptr)(a,b);
printf("a=%d,?b=%d,?max=%d",?a,?b,?c);
return?0;
}