導航:首頁 > 使用方法 > 函數指針使用方法

函數指針使用方法

發布時間:2022-05-13 01:29:29

『壹』 如何使用指針函數和和函數指針

void(*pfunc)(int);
這樣是定義一個函數指針.函數指針定義的時候返回值和參數,參數類型必須和要指向的函數相同,上面的函數指針只能指向沒有返回值,且帶一個INT參數的函數.

『貳』 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++指向函數的指針定義方式為:
返回類型
(*指針名)(函數參數列表),例如
void
(*p)(int)是指向一個返回值為void
參數為int類型的函數。
而若想定義一個指向類成員函數的函數指針該怎麼定義呢?對成員函數指針的使用。
(1)非靜態成員函數
定義方式:返回類型
(類名::*指針名)(函數參數列表)例如void
(A::*p)(int)是一個指向A類中成員函數的函數指針。
賦值方式:p=&A::函數名,而一般的函數指針的賦值是p=函數名即可,注意區別。(成員函數必須是public類型的)
調用方式:成員函數指針的調用必須通過類對象進行調用,a.*p(int)即可調用成員函數(該成員函數是public類型的)
(2)靜態成員函數
對於靜態成員函數的定義和使用方法都與普通函數指針的相同,只是在賦值的時候和非靜態成員們函數指針的賦值方法相同。
因為靜態成員函數的指針類型是與普通函數指針類型相同的。

『肆』 求指針函數的使用!!

1.函數指針定義

函數類型 (*指針變數名)(形參列表);

「函數類型」說明函數的返回類型,由於「()」的優先順序高於「*」,所以指針變數名外的括弧必不可少,後面的「形參列表」表示指針變數指向的函數所帶的參數列表。

例如:

int (*f)(int x);

double (*ptr)(double x);

在定義函數指針時請注意:

函數指針和它指向的函數的參數個數和類型都應該是—致的;

函數指針的類型和函數的返回值類型也必須是一致的。

2.函數指針的賦值

函數名和數組名一樣代表了函數代碼的首地址,因此在賦值時,直接將函數指針指向函數名就行了。

例如,

int func(int x); /* 聲明一個函數 */

int (*f) (int x); /* 聲明一個函數指針 */

f=func; /* 將func函數的首地址賦給指針f */

賦值時函數func不帶括弧,也不帶參數,由於func代表函數的首地址,因此經過賦值以後,指針f就指向函數func(x)的代碼的首地址。

3.通過函數指針調用函數

函數指針是通過函數名及有關參數進行調用的。

與其他指針變數相類似,如果指針變數pi是指向某整型變數i的指針,則*p等於它所指的變數i;如果pf是指向某浮點型變數f的指針,則*pf就等價於它所指的變數f。同樣地,*f是指向函數func(x)的指針,則*f就代表它所指向的函數func。所以在執行了f=func;之後,(*f)和func代表同一函數。

由於函數指針指向存儲區中的某個函數,因此可以通過函數指針調用相應的函數。現在我們就討論如何用函數指針調用函數,它應執行下面三步:

首先,要說明函數指針變數。

例如:int (*f)(int x);

其次,要對函數指針變數賦值。

例如: f=func; (func(x)必須先要有定義)

最後,要用 (*指針變數)(參數表);調用函數。

例如: (*f)(x);(x必須先賦值)

【例】任意輸入n個數,找出其中最大數,並且輸出最大數值。

main()

{

int f();

int i,a,b;

int (*p)(); /* 定義函數指針 */

scanf("%d",&a);

p=f; /* 給函數指針p賦值,使它指向函數f */

for(i=1;i<9;i++)

{
scanf("%d",&b);

a=(*p)(a,b); /* 通過指針p調用函數f */

}

printf("The Max Number is:%d",a)

}

f(int x,int y)

{

int z;

z=(x>y)?x:y;

return(z);

}

運行結果為:

343 -45 4389 4235 1 -534 988 555 789↙

The Max Number is:4389

【指針函數】

一個函數不僅可以帶回一個整型數據的值,字元類型值和實型類型的值,還可以帶回指針類型的數據,使其指向某個地址單元。

返回指針的函數,一般定義格式為:

類型標識符 *函數名(參數表)

int *f(x,y);

其中x,y是形式參數,f是函數名,調用後返回一個指向整型數據的地址指針。f(x,y)是函數,其值是指針。

如:char *ch();表示的就是一個返回字元型指針的函數,請看下面的例題:

【例】將字元串1(str1)復制到字元串2(str2),並輸出字元串2.

#include "stdio.h"

main()

{

char *ch(char *,char *);

char str1[]="I am glad to meet you!";

char str2[]="Welcom to study C!";

printf("%s",ch(str1,str2));

}

char *ch(char *str1,char *str2)

{

int i;

char *p;

p=str2

if(*str2==NULL) exit(-1);

do

{

*str2=*str1;

str1++;

str2++;

}while(*str1!=NULL);

return(p);

}

通過分析可得

函數指針是一個指向函數的指針,而指針函數只是說明他是一個返回值為指針的函數,

函數指針可以用來指向一個函數。

『伍』 函數指針(指向函數的指針) 如何使用 它和回調函數有什麼區別呢

函數指針實質是一個指針,該指針指向函數的入口地址,回調函數只不過是通過參數自己調用自己,首先它是一個函數,跟函數指針完全沒有什麼可比性,風馬牛不相及。
定義一個函數指針你看下:void (*func)(int ,int);
再給你看看比如:int *p; int max(int x,int y);
p=max;這里呢就是一個指針指針一個函數,所以這個p也是一個函數指針,說白了它就只是一個指針,只是不過指向的是一個函數而已,就這么簡單。
就這樣調用就可以了int result=(*p)(a,b)
你們不要總是把函數指針和指針函數比來比去的,也沒有什麼可比性,函數指針就只是一個指針,指針函數就只是一個函數就完了!

『陸』 c語言中函數指針是什麼 有什麼用 舉個實例

函數指針是指向函數的指針變數。 因而「函數指針」本身首先應是指針變數,只不過該指針變數指向函數。這正如用指針變數可指向整型變數、字元型、數組一樣,這里是指向函數。

函數指針有兩個用途:調用函數和做函數的參數。


函數指針的聲明方法為:

返回值類型 ( *指針變數名) ([形參列表]);

如:

int func(int x); /* 聲明一個函數 */

int (*f) (int x); /* 聲明一個函數指針 */

f=func; /* 將func函數的首地址賦給指針f */

或者使用下面的方法將函數地址賦給函數指針:

f = &func;

賦值時函數func不帶括弧,也不帶參數,由於func代表函數的首地址,因此經過賦值以後,指針f就指向函數func(x)的代碼的首地址。

下面的程序說明了函數指針調用函數的方法:

#include<stdio.h>
intmax(intx,inty){return(x>y?x:y);}
intmain()
{
int(*ptr)(int,int);
inta,b,c;
ptr=max;
scanf("%d%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
return0;
}

『柒』 c語言中指針怎麼使用

1、使用場景

使用指針時,必須將它指向一個變數的地址或者為它分配空間方能使用,如下所示:

#include<stdio.h>

#include <stdlib.h>

int main(int argc, char const *argv[])

{

int a[5]={0,1,2,3,4};

int *b,*d;

int c=2;

int *e=a; //e指向a數組首地址

//*b=2; 無法直接初始化

//printf("%d ", *b);

e=e+2; //移動兩個地址單元

d=&c; //d指向c的地址來表示值

c=4; //修改原c變數的值,d指針的值會發生改變

b=(int *)malloc(sizeof(int));//為b分配一個int型空間來直接存儲值

*b=2;//分配空間後可以直接賦值了

printf("this is e,b,c,d :%d %d %d %d ",*e,*b,c,*d);

2、類型說明

(1)int *a :表示一個指向int型變數的指針,指向的是變數的地址單元

(2)char *b:表示一個指向char變數的指針

*a表示的是這個指針指向地址的值,a為此指針本身的地址,這點要明確,一般用*(a+1)、*(a+2)來表示值,如:

int nums[5]={0,1,2,3,4};

int *a=nums;

printf("%d %d %p ",*a,*(a+1),a);

(7)函數指針使用方法擴展閱讀:

指針的運算

指針指向變數地址,若原變數的內容發生了變化,它本身也會發生變化,指針之間的運算一般為值運算和地址運算

(1)值運算:直接通過*運算方式,像a+*(a+1),結果為第一個元素與第二個元素相加。

int nums[5]={0,1,2,3,4};

int *a=nums;

(2)地址運算:通過a+i的方式.指針會指向a的下i個地址。

int nums[5]={0,1,2,3,4};

int *a=nums;

a=a+2;

printf("%d ",*a);

結果輸出2。

參考資料來源 :指針-網路

『捌』 c++的函數指針是怎麼用的呀

函數指針,即指向函數的指針。

1.定義

每一個函數都佔用一段內存單元,它們有一個起始地址,指向函數入口地址的指針稱為函數指針。

2.語法

指向函數的指針變數的一般定義形式為:

數據類型(*指針變數名)(參數表);

3.說明

1)函數指針的定義形式中的數據類型是指函數的返回值的類型。

2)區分下面兩個語句:

int (*p)(int a, int b); //p是一個指向函數的指針變數,所指函數的返回值類型為整型

int *p(int a, int b); //p是函數名,此函數的返回值類型為整型指針

3)指向函數的指針變數不是固定指向哪一個函數的,而只是表示定義了一個這樣類型的變數,它是專門用來存放函數的入口地址的;在程序中把哪一個函數的地址賦給它,它就指向哪一個函數。

4)在給函數指針變數賦值時,只需給出函數名,而不必給出參數。

如函數max的原型為:int max(int x, int y);指針p的定義為:int (*p)(int a, int b);則p = max;的作用是將函數max的入口地址賦給指針變數p。這時,p就是指向函數max的指針變數,也就是p和max都指向函數的開頭。

5)在一個程序中,指針變數p可以先後指向不同的函數,但一個函數不能賦給一個不一致的函數指針(即不能讓一個函數指針指向與其類型不一致的函數)。

如有如下的函數:int fn1(int x, int y);int fn2(int x);

定義如下的函數指針:int (*p1)(int a, int b);int (*p2)(int a);

p1 = fn1; //正確

p2 = fn2; //正確

p1 = fn2; //產生編譯錯誤

6)定義了一個函數指針並讓它指向了一個函數後,對函數的調用可以通過函數名調用,也可以通過函數指針調用(即用指向函數的指針變數調用)。

如語句:c = (*p)(a, b); //表示調用由p指向的函數(max),實參為a,b,函數調用結束後得到的函數值賦給c。

7)函數指針只能指向函數的入口處,而不可能指向函數中間的某一條指令。不能用*(p+1)來表示函數的下一條指令。

8)函數指針變數常用的用途之一是把指針作為參數傳遞到其他函數

實例:

#include<iostream>
usingnamespacestd;
#include<conio.h>

intmax(intx,inty);//求最大數
intmin(intx,inty);//求最小數
intadd(intx,inty);//求和
voidprocess(inti,intj,int(*p)(inta,intb));//應用函數指針

intmain()
{
intx,y;
cin>>x>>y;

cout<<"Maxis:";
process(x,y,max);

cout<<"Minis:";
process(x,y,min);

cout<<"Addis:";
process(x,y,add);

getch();
return0;
}

intmax(intx,inty)
{
returnx>y?x:y;
}

intmin(intx,inty)
{
returnx>y?y:x;
}

intadd(intx,inty)
{
returnx+y;
}

voidprocess(inti,intj,int(*p)(inta,intb))
{
cout<<p(i,j)<<endl;
}

『玖』 函數指針的方法

函數指針的聲明方法為:
返回值類型 ( * 指針變數名) ([形參列表]);
注1:「返回值類型」說明函數的返回類型,「(指針變數名 )」中的括弧不能省,括弧改變了運算符的優先順序。若省略整體則成為一個函數說明,說明了一個返回的數據類型是指針的函數,後面的「形參列表」表示指針變數指向的函數所帶的參數列表。例如:
int func(int x); /* 聲明一個函數 */
int (*f) (int x); /* 聲明一個函數指針 */
f=func; /* 將func函數的首地址賦給指針f */
或者使用下面的方法將函數地址賦給函數指針:
f = &func;
賦值時函數func不帶括弧,也不帶參數,由於func代表函數的首地址,因此經過賦值以後,指針f就指向函數func(x)的代碼的首地址。
注2:函數括弧中的形參可有可無,視情況而定。
下面的程序說明了函數指針調用函數的方法:
例一、 #include<stdio.h>intmax(intx,inty){return(x>y?x:y);}intmain(){int(*ptr)(int,int);inta,b,c;ptr=max;scanf("%d%d",&a,&b);c=(*ptr)(a,b);printf("a=%d,b=%d,max=%d",a,b,c);return0;}ptr是指向函數的指針變數,所以可把函數max()賦給ptr作為ptr的值,即把max()的入口地址賦給ptr,以後就可以用ptr來調用該函數,實際上ptr和max都指向同一個入口地址,不同就是ptr是一個指針變數,不像函數名稱那樣是死的,它可以指向任何函數,就看你想怎麼做了。在程序中把哪個函數的地址賦給它,它就指向哪個函數。而後用指針變數調用它,因此可以先後指向不同的函數。不過注意,指向函數的指針變數沒有++和--運算,用時要小心。
不過,在某些編譯器中這是不能通過的。這個例子的補充如下。
應該是這樣的:
1.定義函數指針類型:
typedef int (*fun_ptr)(int,int);
2.聲明變數,賦值:
fun_ptr max_func=max;
也就是說,賦給函數指針的函數應該和函數指針所指的函數原型是一致的。
例二、 #include<stdio.h>voidFileFunc(){printf("FileFunc ");}voidEditFunc(){printf("EditFunc ");}voidmain(){typedefvoid(*funcp)();funcppfun=FileFunc;pfun();pfun=EditFunc;pfun();}

『拾』 指向函數的指針用法

看完以下的,您就知道什麼是指向函數的指針了,其實就是回調函數!

程序員常常需要實現回調。本文將討論函數指針的基本原則並說明如何使用函數指針實現回調。注意這里針對的是普通的函數,不包括完全依賴於不同語法和語義規則的類成員函數(類成員指針將在另文中討論)。

聲明函數指針

回調函數是一個程序員不能顯式調用的函數;通過將回調函數的地址傳給調用者從而實現調用。要實現回調,必須首先定義函數指針。盡管定義的語法有點不可思議,但如果你熟悉函數聲明的一般方法,便會發現函數指針的聲明與函數聲明非常類似。請看下面的例子:

void f();// 函數原型

上面的語句聲明了一個函數,沒有輸入參數並返回void。那麼函數指針的聲明方法如下:

void (*) ();

讓我們來分析一下,左邊圓括弧中的星號是函數指針聲明的關鍵。另外兩個元素是函數的返回類型(void)和由邊圓括弧中的入口參數(本例中參數是空)。注意本例中還沒有創建指針變數-只是聲明了變數類型。目前可以用這個變數類型來創建類型定義名及用sizeof表達式獲得函數指針的大小:

// 獲得函數指針的大小
unsigned psize = sizeof (void (*) ());

// 為函數指針聲明類型定義
typedef void (*pfv) ();

pfv是一個函數指針的自定義類型,它指向的函數沒有輸入參數,返回類行為void。使用這個類型定義名可以隱藏復雜的函數指針語法。

指針變數應該有一個變數名:

void (*p) (); //p是指向某函數的指針

p是指向某函數的指針,該函數無輸入參數,返回值的類型為void。左邊圓括弧里星號後的就是指針變數名。有了指針變數便可以賦值,值的內容是署名匹配的函數名和返回類型。例如:

void func()
{
/* do something */
}
p = func;

p的賦值可以不同,但一定要是函數的地址,並且署名和返回類型相同。

傳遞回調函數的地址給調用者

現在可以將p傳遞給另一個函數(調用者)- caller(),它將調用p指向的函數,而此函數名是未知的:

void caller(void(*ptr)())
{
ptr(); /* 調用ptr指向的函數 */
}
void func();
int main()
{
p = func;
caller(p); /* 傳遞函數地址到調用者 */
}

如果賦了不同的值給p(不同函數地址),那麼調用者將調用不同地址的函數。賦值可以發生在運行時,這樣使你能實現動態綁定。

調用規范

到目前為止,我們只討論了函數指針及回調而沒有去注意ANSI C/C++的編譯器規范。許多編譯器有幾種調用規范。如在Visual C++中,可以在函數類型前加_cdecl,_stdcall或者_pascal來表示其調用規范(默認為_cdecl)。C++ Builder也支持_fastcall調用規范。調用規范影響編譯器產生的給定函數名,參數傳遞的順序(從右到左或從左到右),堆棧清理責任(調用者或者被調用者)以及參數傳遞機制(堆棧,CPU寄存器等)。

將調用規范看成是函數類型的一部分是很重要的;不能用不兼容的調用規范將地址賦值給函數指針。例如:

// 被調用函數是以int為參數,以int為返回值
__stdcall int callee(int);

// 調用函數以函數指針為參數
void caller( __cdecl int(*ptr)(int));

// 在p中企圖存儲被調用函數地址的非法操作
__cdecl int(*p)(int) = callee; // 出錯

指針p和callee()的類型不兼容,因為它們有不同的調用規范。因此不能將被調用者的地址賦值給指針p,盡管兩者有相同的返回值和參數列。

閱讀全文

與函數指針使用方法相關的資料

熱點內容
東莞治療痤瘡的方法 瀏覽:229
芥菜種植時間和方法 瀏覽:972
世界上最簡單的炒股方法 瀏覽:317
男士戴項鏈的正確方法圖片 瀏覽:39
雞蛋的正確方法 瀏覽:176
大疆無人機鑒別方法 瀏覽:631
化學反應中常用方法 瀏覽:578
失眠做夢怎麼治療方法 瀏覽:180
液相色譜分析方法通則 瀏覽:795
乾洗衣服的方法和工具技巧 瀏覽:472
食用菌糖製品製作方法 瀏覽:330
如何克服怒氣的方法 瀏覽:946
pro胸肌訓練方法大全集 瀏覽:350
筆記本電腦開機鍵失靈的解決方法 瀏覽:660
如何做爆米花兒童簡單方法 瀏覽:329
嬰兒兩個月不喝奶瓶的解決方法 瀏覽:155
我的世界模組視頻製作方法 瀏覽:768
熱冷交換方法有哪些 瀏覽:898
牛油果柑的種植方法 瀏覽:950
肝多發性治療方法 瀏覽:530