『壹』 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;
}
『貳』 如何通過函數指針調用函數
一般需要定義一個函數指針類型
typedef int (*function_pointer_t) ( int arg1, int arg2 );
然後,定義函數指針變數
function_pointer_t fp_invoker = 0;
函數指針可以動態改變內容,改變調用對象,假設有兩個函數
int function_sum( int arg1, int arg2 )
{
return arg1+arg2;
}
int function_sub( int arg1, int arg2 )
{
return arg1-arg2;
}
注意到兩個函數的原型與函數指針類型是一致旦廳緩的。以下是調用
fp_invoker = function_sum; // 直接用函數名賦值即可
fp_invoker(1,2); // 調用時模模,可以認為函數指針便是函數名,此時調用加法
fp_invoker = function_sub; // 同理,切換到減法
fp_invoker(1,2); // 調用減法
以上都是直觀的用法,通常函數指針用於回調,即下層函數先將函數指針內容保存起來,處理結束後,再調用。此時要注意首先檢查函數指針內容是否為伏悉空。
if( fp_invoker ){
fp_invoker( arg1, arg2 );
}
『叄』 C語言中函數指針用法
函數在內存中有一個物理位置,而這個位置是可以賦給一個指針的。一零點函數的地址就是該函數的入口點。因此,函數指針可被用來調用一個函數。函數的地址是用不帶任何括弧或參數的函數名來得到的。(這很類似於數組地址的得到方法,即,在只有數組名而無下標是就得到數組地址。)
怎樣說明一個函數指針變數呢 ?
為了說明一個變數 fn_pointer 的類型是"返回值為 int 的函數指針", 你可以使用下面的說明語句:
int (*fn_pointer) ();
為了讓編譯器能正確地解釋這句語句, *fn_pointer 必須用括弧圍起來。若漏了這對括弧, 則:
int *fn_pointer ();
的意思完全不同了。fn_pointer 將是一個函數名, 其返回值為 int 類型的指針。
2:函數指針變數
在C語言中規定,一個函數總是佔用一段連續的內存區, 而函數名就是該函數所佔內存區的首地址。 我們可以把函數的這個首地址 ( 或稱入口地址 ) 賦予一個指針變數, 使該指針變數指向該函數。然後通過指針變數就可以找到並調用這個函數。我們把這種指向函數的指針變數稱為 " 函數指針變數 " 。
函數指針變數定義的一般形式為:
類型說明符 (* 指針變數名 )();
其中 " 類型說明符 " 表示被指函數的返回值的類型。 "(* 指針變數名 )" 表示 "*" 後面的變數是定義的指針變數。 最後的空括弧表示指針變數所指的是一個函數。
例如: int (*pf)();
表示 pf 是一個指向函數入口的指針變數,該函數的返回值 ( 函數值 ) 是整型。
下面通過例子來說明用指針形式實現對函數調用的方法。
int max(int a,int b)
{
if(a>b)return a;
else return b;
}
main()
{
int max(int a,int b);
int(*pmax)();
int x,y,z;
pmax=max;
printf("input two numbers:/n");
scanf("%d%d",&x,&y);
z=(*pmax)(x,y);
printf("maxmum=%d",z);
}
從上述程序可以看出用,函數指針變數形式調用函數的步驟如下:
1>. 先定義函數指針變數,如後一程序中第 9 行 int (*pmax)(); 定義 pmax 為函數指針變數。
2>. 把被調函數的入口地址 ( 函數名 ) 賦予該函數指針變數,如程序中第 11 行 pmax=max;
3>. 用函數指針變數形式調用函數,如程序第 14 行 z=(*pmax)(x,y); 調用函數的一般形式為: (* 指針變數名 ) ( 實參表 ) 使用函數指針變數還應注意以下兩點:
a. 函數指針變數不能進行算術運算,這是與數組指針變數不同的。數組指針變數加減一個整數可使指針移動指向後面或前面的數組元素,而函數指針的移動是毫無意義的。
b. 函數調用中 "(* 指針變數名 )" 的兩邊的括弧不可少,其中的 * 不應該理解為求值運算,在此處它只是一種表示符號。
3:指針型函數
前面我們介紹過,所謂函數類型是指函數返回值的類型。 在C語言中允許一個函數的返回值是一個指針 ( 即地址 ) ,這種返回指針值的函數稱為指針型函數。
定義指針型函數的一般形式為:
類型說明符 * 函數名 ( 形參表 )
{
…… /* 函數體 */
}
其中函數名之前加了 "*" 號表明這是一個指針型函數,即返回值是一個指針。類型說明符表示了返回的指針值所指向的數據類型。
如:
int *ap(int x,int y)
{
…… /* 函數體 */
}
表示 ap 是一個返回指針值的指針型函數, 它返回的指針指向一個整型變數。下例中定義了一個指針型函數 day_name ,它的返回值指向一個字元串。該函數中定義了一個靜態指針數組 name 。 name 數組初始化賦值為八個字元串,分別表示各個星期名及出錯提示。形參 n 表示與星期名所對應的整數。在主函數中, 把輸入的整數 i 作為實參, 在 printf 語句中調用 day_name 函數並把 i 值傳送給形參 n 。 day_name 函數中的 return 語句包含一個條件表達式, n 值若大於 7 或小於 1 則把 name[0] 指針返回主函數輸出出錯提示字元串 "Illegal day" 。否則返回主函數輸出對應的星期名。主函數中的第 7 行是個條件語句,其語義是,如輸入為負數 (i<0) 則中止程序運行退出程序。 exit 是一個庫函數, exit(1) 表示發生錯誤後退出程序, exit(0) 表示正常退出。
應該特別注意的是函數指針變數和指針型函數這兩者在寫法和意義上的區別。如 int(*p)() 和 int *p() 是兩個完全不同的量。 int(*p)() 是一個變數說明,說明 p 是一個指向函數入口的指針變數,該函數的返回值是整型量, (*p) 的兩邊的括弧不能少。
int *p() 則不是變數說明而是函數說明,說明 p 是一個指針型函數,其返回值是一個指向整型量的指針,*p 兩邊沒有括弧。作為函數說明, 在括弧內最好寫入形式參數,這樣便於與變數說明區別。 對於指針型函數定義,int *p() 只是函數頭部分,一般還應該有函數體部分。
main()
{
int i;
char *day_name(int n);
printf("input Day No:/n");
scanf("%d",&i);
if(i<0) exit(1);
printf("Day No:%2d-->%s/n",i,day_name(i));
}
char *day_n
ame(int n)
{
static char *name[]={ "Illegal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"};
return((n<1||n>7) ? name[0] : name[n]);
}
本程序是通過指針函數,輸入一個 1 ~ 7 之間的整數, 輸出對應的星期名。指針數組的說明與使用一個數組的元素值為指針則是指針數組。指針數組是一組有序的指針的集合。指針數組的所有元素都必須是具有相同存儲類型和指向相同數據類型的指針變數。
指針數組說明的一般形式為: 類型說明符 * 數組名 [ 數組長度 ]
其中類型說明符為指針值所指向的變數的類型。例如: int *pa[3] 表示 pa 是一個指針數組,它有三個數組元素, 每個元素值都是一個指針,指向整型變數。通常可用一個指針數組來指向一個二維數組。 指針數組中的每個元素被賦予二維數組每一行的首地址,因此也可理解為指向一個一維數組。圖 6—6 表示了這種關系。
int a[3][3]={1,2,3,4,5,6,7,8,9};
int *pa[3]={a[0],a[1],a[2]};
int *p=a[0];
main()
{
int i;
for(i=0;i<3;i++)
printf("%d,%d,%d/n",a[i][2-i],*a[i],*(*(a+i)+i));
for(i=0;i<3;i++)
printf("%d,%d,%d/n",*pa[i],p[i],*(p+i));
}
本常式序中, pa 是一個指針數組,三個元素分別指向二維數組 a 的各行。然後用循環語句輸出指定的數組元素。其中 *a[i] 表示 i 行 0 列元素值; *(*(a+i)+i) 表示 i 行 i 列的元素值; *pa[i] 表示 i 行 0 列元素值;由於 p 與 a[0] 相同,故 p[i] 表示 0 行 i 列的值; *(p+i) 表示 0 行 i 列的值。讀者可仔細領會元素值的各種不同的表示方法。 應該注意指針數組和二維數組指針變數的區別。 這兩者雖然都可用來表示二維數組,但是其表示方法和意義是不同的
『肆』 如何定義指向函數的指針
一、定義一個函數指針的方法如下:
返回值類型 (* 指針變數名)([形參列表]);
1、int func(int x); /* 聲明一個函數 */
2、int (*f) (int x); /* 聲明一個函數指針 */
3、f=func; /* 將func函數的首地址賦給指針f */
二、函數指針的用法:
函數指針的應用:(*指針變數名)(參歷罩數列表)
如:int c=(*ptr)(a,b);/* 函數指針 的使用*/
在C語言中,函數本身不是變數,但是可以定義指向函數的指針,也稱作函數指針,函數指針指向函數的入口地址。這種類型的指針可以被賦值、存放在數組中、傳遞給函數以及作為函數的返回值等等。
(4)函數指針的使用方法擴展閱讀:
指針函數和函數指針的區別:
1、這兩個概念都是簡稱,指針歲讓函數是指返回值是指針的函數,即本質是一個函數。我們知道函數都有返回類型(如果不返回值,則為無值型),只不過指針函數返回類型是某一類型的指針。
2、返回指針的函數的用途十分廣泛。事實上,每一個函數,即使它不帶有返回某種類乎爛局型的指針,它本身都有一個入口地址,該地址相當於一個指針。比如函數返回一個整型值,實際上也相當於返回一個指針變數的值,不過這時的變數是函數本身而已,而整個函數相當於一個「變數」。
『伍』 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);
指針的運算
指針指向變數地址,若原變數的內容發生了變化,它本身也會發生變化,指針之間的運算一般為值運算和地址運算
(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。
『陸』 指向函數的指針用法
看完以下的,您就知道什麼是指向函數的指針了,其實就是回調函數!
程序員常常需要實現回調。本文將討論函數指針的基本原則並說明如何使用函數指針實現回調。注意這里針對的是普通的函數,不包括完全依賴於不同語法和語義規則的類成員函數(類成員指針將在另文中討論)。
聲明函數指針
回調函數是一個程序員不能顯式調用的函數;通過將回調函數的地址傳給調用者從而實現調用。要實現回調,必須首先定義函數指針。盡管定義的語法有點不可思議,但如果你熟悉函數聲明的一般方法,便會發現函數指針的聲明與函數聲明非常類似。請看下面的例子:
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,盡管兩者有相同的返回值和參數列。
『柒』 如何調用指針函數
1.如果是返回值是指針
char* getname()
{
char* pname=new char[23]; //返回指針必須是函數釋放後並未釋放的內存空型返間,
cout<<"input your name:\n"; //一般返回兩種情況,一是在函數中像該函數一樣動態分配堆內存
cin.getline(pname,22); //二是返回指針指向參數中地址,如: int* max(int a,int b) { return &a; }
pname[22]='\0';
return pname;
}
int main()
{
char* name=getname();
cout<<"your name is: "<<name<<endl;
delete []name; //記得動態釋放分配內存
return 0;
}
2.參數是指針類型
常見的是通過指針或引用交換兩個數的值
void swa(int* p1,int* p2)
{
int temp=*p1; *p1=*p2; *p2=temp;
}
int main()
{
int a=2,b=3;
swa(&a,&b); //傳遞地址
return 0;
}
附解:你可以把指針看做冊租埋是一種復合類型,它之所以可以修改參數值,本質是因為
對指針解除引用*p形式是操作的參數所存數據內存空間,但如果它不解除引用,它
並不會修改參數的值:如
void swa(int* p1,int* p2) //函數意思是最初始在函數參數塊中定義兩個指針p1,p2,使
{ //p1指向a,p2指向b,下面函數體只是使指針指向地址改變,成了
//州螞p1指向b,p2指向a。但並未對a,b內存空間操作,當函數調用結束後,指針p1,p2
//也釋放了,所以並未起任何作用
int* temp;
temp=p1; p1=p2; p2=temp;
}
int main()
{
int a=2,b=3;
swa(&a,&b); //傳遞地址
cout<<a<<" "<<b;
return 0;
}
這個函數並不會交換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++指向函數的指針定義方式為:
返回類型
(*指針名)(函數參數列表),例如
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);
}
通過分析可得
函數指針是一個指向函數的指針,而指針函數只是說明他是一個返回值為指針的函數,
函數指針可以用來指向一個函數。