1樓:牽著你的手
c++指向函式的指標定義方式為:
返回型別 (*指標名)(函式引數列表),例如 void (*p)(int)是指向一個返回值為void 引數為int型別的函式。
而若想定義一個指向類成員函式的函式指標該怎麼定義呢?對成員函式指標的使用。
(1)非靜態成員函式
定義方式:返回型別 (類名::*指標名)(函式引數列表)例如void (a::*p)(int)是一個指向a類中成員函式的函式指標。
賦值方式:p=&a::函式名,而一般的函式指標的賦值是p=函式名即可,注意區別。(成員函式必須是public型別的)
呼叫方式:成員函式指標的呼叫必須通過類物件進行呼叫,a.*p(int)即可呼叫成員函式(該成員函式是public型別的)
(2)靜態成員函式
對於靜態成員函式的定義和使用方法都與普通函式指標的相同,只是在賦值的時候和非靜態成員們函式指標的賦值方法相同。
因為靜態成員函式的指標型別是與普通函式指標型別相同的。
2樓:
1.a 2.d
都正確的原因是,p=f時會進行隱式型別轉換,f被轉換成指標型別p=&f我就不解釋了,指標賦值很明顯
再一個void f( ) ;不是宣告,是定義void f();這才是宣告
下面兩個不會
3樓:匿名使用者
詳見:《指標的藝術》
ps:臺灣作者寫的。你買本看看
請教c++中函式型指標和指標型函式的用法和區別,謝謝
4樓:匿名使用者
1 函式指標變數
在c語言中,一個函式總是佔用一段連續的記憶體區,而函式名就是該函式所佔記憶體區的首地址。我們可以把函式的這個首地址(或稱入口地址)賦予一個指標變數,使該指標變數指向該函式。然後通過指標變數就可以找到並呼叫這個函式。
我們把這種指向函式的指標變數稱為“函式指標變數”。
函式指標變數定義的一般形式為:
型別說明符 (*指標變數名)();
其中“型別說明符”表示被指函式的返回值的型別。“(* 指標變數名)”表示“*”後面的變數是定義的指標變數。最後的空括號表示指標變數所指的是一個函式。
例如:int (*pf)();
表示pf是一個指向函式入口的指標變數,該函式的返回值(函式值)是整型。
【例】本例用來說明用指標形式實現對函式呼叫的方法。
int max(int a,int b)
main()
從上述程式可以看出用,函式指標變數形式呼叫函式的步驟如下:
1) 先定義函式指標變數,如後一程式中第9行 int (*pmax)();定義 pmax為函式指標變數。
2) 把被調函式的入口地址(函式名)賦予該函式指標變數,如程式中第11行 pmax=max;
3) 用函式指標變數形式呼叫函式,如程式第14行 z=(*pmax)(x,y);
4) 呼叫函式的一般形式為:
(*指標變數名) (實參表)
使用函式指標變數還應注意以下兩點:
a) 函式指標變數不能進行算術運算,這是與陣列指標變數不同的。陣列指標變數加減一個整數可使指標移動指向後面或前面的陣列元素,而函式指標的移動是毫無意義的。
b) 函式呼叫中"(*指標變數名)"的兩邊的括號不可少,其中的*不應該理解為求值運算,在此處它只是一種表示符號。
2 指標型函式
前面我們介紹過,所謂函式型別是指函式返回值的型別。在c語言中允許一個函式的返回值是一個指標(即地址),這種返回指標值的函式稱為指標型函式。
定義指標型函式的一般形式為:
型別說明符 *函式名(形參表)
其中函式名之前加了“*”號表明這是一個指標型函式,即返回值是一個指標。型別說明符表示了返回的指標值所指向的資料型別。
如:int *ap(int x,int y)
表示ap是一個返回指標值的指標型函式,它返回的指標指向一個整型變數。
【例】本程式是通過指標函式,輸入一個1~7之間的整數,輸出對應的星期名。
main()
char *day_name(int n);
return((n<1||n>7) ? name[0] : name[n]);
}本例中定義了一個指標型函式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()只是函式頭部分,一般還應該有函式體部分。
5樓:椴
函式指標:是指向函式的指標變數,在c編譯時,每一個函式都有一個入口地址,那麼這個指向這個函式的函式指標便指向這個地址。
函式指標的用途是很大的,主要有兩個作用:用作呼叫函式和做函式的引數。
函式指標的宣告方法:
資料型別標誌符 (指標變數名) (形參列表);
一般函式的宣告為:
int func ( int x );
而一個函式指標的宣告方法為:
int (*func) (int x);
前面的那個(*func)中括號是必要的,這會告訴編譯器我們宣告的是函式指標而不是宣告一個具有返回型為指標的函式,後面的形參要視這個函式指標所指向的函式形參而定。
然而這樣宣告我們有時覺得非常繁瑣,於是typedef可以派上用場了,我們也可以這樣宣告:
typedef int (*pf) (int x);
pf pf;
這樣pf便是一個函式指標,方便了許多。當要使用函式指標來呼叫函式時,func(x)或者 (*fucn)(x) 就可以了,當然,函式指標也可以指向被過載的函式,編譯器會為我們區分這些過載的函式從而使函式指標指向正確的函式。
例子:複製**
typedef void (*pft) ( char ,int );
void bar(char ch, int i)
pft pft;
pft = bar;
pft('e',91);
複製**
typedef void (*pft) ( char ,int );
void bar(char ch, int i)
void foo(char ch, int i, pft pf)
pft pft;
pft = bar;
foo('e',12,pft);
複製**
上述例子我們首先利用一個函式指標pft指向bar(),然後在foo()函式中使用pft指標來呼叫bar(),實現目的。將這個特點稍加利用,我們就可以構造出強大的程式,只需要同樣的foo函式便可以實現對不同bar函式的呼叫。
6樓:匿名使用者
函式型指標,也即指標指向的是一種函式型別,首先指向的是函式,並且這個函式有型別(形參,返回值)
如:int (* pmax)(int a,int b);
指標 pmax 即是一個函式型指標,這個函式的型別是,返回值為int,並帶有兩個int 型的形參
指標型函式,也即返回型別為指標的函式
如:char * mystrcat(char * p1,const char *2);
char *s1 = "jaycnvip";
char *purl = mystrcat(s1,".com");
指標 purl 即儲存了函式 mystrcat 返回的字元指標
7樓:
簡單的就是一個用指標去儲存函式是函式型指標而函式&形參為指標的是指標型函式
像函式型指標 :int (*s); //用它去指向一個返回為int函式 ,像int u(int s){}
然後把函式地址給*s,*s=u;
最後可以用s(5)就可以等於u(5);
而指標型函式,像void *s(char *s){}就是了 。。。
8樓:year醫海無邊
c#中採用委託的方式,其實和c++的typedef非常相像,都是必須先定義一個型別,然後用該型別去宣告一個變數。最大的不同在賦值階段,c++只需要簡單的將函式地址賦給指標,而c#必須用new宣告一個物件,並且還要求相應的函式作為形參傳入。在這個階段,似乎c#顯得更為複雜。
到了呼叫階段,c++和c#都可以容器後加個括號就能完成呼叫,但c++還多了一種*的方式。
9樓:
函式型指標是指標,指向函式
int (*fp)();
指標型函式是函式,返回指標
int * pf();
指標的初始化,指標變數的如何初始化?
拜託,這是宣告,不是定義變數,沒有變數,何來初始化?你甚至可以把thecat去掉。問題補充 這是函式定義,你前面的是函式宣告。thecat指標變數的初始化是由主調函式完成的,functiontwo函式不必理會,也不應理會,直接拿來用就行。c語言指標使用前必須初始化?指標申明的時候最好初始化。初始化以...
C類初始化呼叫哪個函式
當然是呼叫這個建構函式咯 string const char 你應該見過這樣的賦值吧 char p ch 1234 沒錯,1234 是指向堆 不是棧 中記憶體塊的乙個指標。其型別應該是char const 被隱式轉換成了const char string str1 fantuan 它實際過程是str...
cc通過初始化列表和建構函式內賦值初始化成員
周生 看你的成員變數型別和繼承方式了,公有成員變數和公有繼承,直接賦值就行了。私有成員變數,繼承之後要在初始化列表中初始化 初始化表的必要性 1 類中包含常量和引用型的成員變數。必須通過建構函式和初始化表顯式地對其進行初始化。2 在子類中顯式地構造其基類部分。class a a int n m n ...