c語言指向函數的指針
『壹』 c語言如何定義一個指向指針函數的函數指針
void*f(int);//一個指針函數f
void*(*p)(int)=f;//一個指向f的函數指針p
『貳』 C語言指向函數指針問題
#include
<stdio.h>
void
main()
{
int
max(int
,int
);
int
(*p)(int
,int);
p=max;
//此處利用
p=max是正確的指向函數的指針的用法,p指向max的入口地址
//此處用*p=max得到相同結論,為什麼呢?因為你這樣賦值之後*p的內容就是max
//所以在執行(*p)(q,w)它時其實是執行的(max)(q,w),如果是p=max此時執行(*p)(q,w)是等價於執行max(q,w)。
int
q,w;
printf("please
input
the
two
numbers:\n");
scanf("%d%d",&q,&w);
printf("the
larger
number
is:%d",(*p)(q,w));
}
////////////////////////////////////
int
max(int
a,int
b)
{
if(a>b)
return
a;
else
return
b;
}
『叄』 C語言中函數指針用法
在C語言中,指針被廣泛使用,而函數指針是最為高級的用法之一,也是容易疑惑的地方之一。看下面這段代碼:#include <stdio.h>void F(int a, int* output)
{
printf("a = %d\n", a);
*output = a + 1;
}typedef void (*FUNC)();int main()
{
FUNC f = F;
int ret = 0;
f(3, &ret);printf("ret = %d\n", ret);
return 0;
}上面看出 FUNC 的類型是與F的類型不匹配的,這樣可以通過編譯嗎?答案是: 可以的。由於在C語言中編譯函數的時候,是僅僅將其函數名作為該函數的
唯一標識,為其分配相應地址。所以雖然FUNC 與 F的類型不一致,但是對於編譯器看來
都是兩個地址,是無所謂的。用上面的特點,可以寫出非常通用的函數指針類型,typedef int (*FUNC)(); 這里之所有要有返回值,是用來標識該函數是否執行成功的錯誤代碼標志。 隨說做了有一段時間的C了,但盡然沒有搞明白函數指針的用法,見到了也沒有好好研究,今天終於有時間了,在網上搜了一下,終於弄懂了.原來就是定義了一個指針變數,只不過形式有點怪罷了.其實還是當成指針用就行了!一般有兩種用法:1定義函數指針int (*functionPoint)(int, int)----這只是定義了一個指向函數的指針int a(int a,int b)----------------這是與之相符的函數原型void main()-----------------------使用{ functionPoint = a;------------先賦值 functionPoint(1,2);----------調用
}2用typedef定義使用typedef int (*functionPoint)(int,int);----------定義了一種類型名為functionPoint的指針int a(int a, int b)-----------------------------函數原型void main(){ functionPoint fun;---------------------------定義指針 fun = a;-------------------------------------賦值 fun(1,2);---------------------------------使用
}函數就是這個函數的指針.
『肆』 c語言中函數指針是什麼 有什麼用 舉個實例
函數指針指函數的入口地址,作用就是跳轉。比如設置回調函數,線程函數、結構體中的成員函數等。
回調:
typedefvoid(WINAPI*USBCALLBACK)(bool,bool);//回調函數
……
USBCALLBACKpCallBack;
voidSetCallBack(USBCALLBACKUSBCallBack)//回調,指定設備接入或拔出
{
pCallBack=USBCallBack;
}
線程
DWORDWINAPIDataHandleThread(LPVOIDlParam)//處理數據線程
{
//TODO:
}
……
m_hDataHandle=CreateThread(NULL,0,DataHandleThread,this,0,NULL);//啟動線程
結構體
typedefstructLUNARHANDLE
{
bool(*GetLunar)(intiYear,intiMonth,intiDay,LUNARDATE*lunardate);
};
以上這幾種用法都摘自我自己的項目,請參考。
『伍』 C語言指向函數的指針 求翻譯
#include<stdio.h>
intf1(int(*f)(int));//函數指針
intf2(inti);
intmain(void)
{
printf("Answer:%d ",f1(f2));//指向f2
return0;
}
intf1(int(*f)(int))//定義函數指針
{
intn=0;
while((*f)(n))n++;//回調函數,當指針不是NULL時,代入n
return0;
}
intf2(inti)
{
returni*i+i-12;
}
//也就是每個函數入口都是一個地址
//函數無它,唯指令集合而已,上面只是換個地址執行指令而已
『陸』 如何定義指向函數的指針
一、定義一個函數指針的方法如下:
返回值類型 (* 指針變數名)([形參列表]);
1、int func(int x); /* 聲明一個函數 */
2、int (*f) (int x); /* 聲明一個函數指針 */
3、f=func; /* 將func函數的首地址賦給指針f */
二、函數指針的用法:
函數指針的應用:(*指針變數名)(參數列表)
如:int c=(*ptr)(a,b);/* 函數指針 的使用*/
在C語言中,函數本身不是變數,但是可以定義指向函數的指針,也稱作函數指針,函數指針指向函數的入口地址。這種類型的指針可以被賦值、存放在數組中、傳遞給函數以及作為函數的返回值等等。
(6)c語言指向函數的指針擴展閱讀:
指針函數和函數指針的區別:
1、這兩個概念都是簡稱,指針函數是指返回值是指針的函數,即本質是一個函數。我們知道函數都有返回類型(如果不返回值,則為無值型),只不過指針函數返回類型是某一類型的指針。
2、返回指針的函數的用途十分廣泛。事實上,每一個函數,即使它不帶有返回某種類型的指針,它本身都有一個入口地址,該地址相當於一個指針。比如函數返回一個整型值,實際上也相當於返回一個指針變數的值,不過這時的變數是函數本身而已,而整個函數相當於一個「變數」。
『柒』 C語言指向函數的指針的調用
#include<stdio.h>
int *d_bubblesort(int a[],int n)//數組長度為n的冒泡降序排序
{
int i,j;
int temp;
for(i=0;i<n;i++)
{
for(j=n-1;j>i;j--)
{
if(a[j]>a[j-1])
{
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
}
return a;
}
void main()
{
int i;
int *p=NULL;
int a[10]={6,5,4,1,2,3,9,8,7,10};
int *(*fun)(int*,int);
fun=d_bubblesort;
p=fun(a,10);
for(i=0;i<10;i++)
{
printf("%d\t",p[i]);
}
}
『捌』 C語言——指向函數的指針
c語言中叫做回調函數,將函數指針(如max)作為函數的參數,函數(如fun)中調用這個參數指向的函數,
調用函數(fun)時看情況而給函數傳入不同的函數指針
例如fun(a,b,min),那麼fun函數調用執行三個參數就調用min函數
參數的定義要與傳入的函數指針相匹配
例如fun(int,x,int y,(*p)(int,int)) 那麼調用fun(a,b,min)時,min的參數必須是(int ,int)