c 函式名本質上就是指標,那麼單獨定義指向函式的指標有什麼意義?話說函式指標還沒太看懂什麼意思

時間 2022-09-30 04:10:35

1樓:匿名使用者

函式嘛,就是一段**完成一定的功能

編譯以後就是乙個函式名對應乙個**的位址

c裡邊有函式指標

可以通過函式指標呼叫函式

可以在一定程度上簡化**書寫

不過還有乙個非常有用的地方就是**,就是乙個函式裡通過引數中的函式指標呼叫外部函式

比如c裡邊的快速排序,windows程式開發中就更多了

2樓:匿名使用者

函式指標儲存的是函式**的記憶體位址

函式名不代表指標,嚴格來說需要使用 &fun 得到函式位址

只是某些編譯器做了簡化,可以省略這個 &

3樓:匿名使用者

函式指標與一般指標並無大的理解上的差別。試想直接使用變數 int i; 與指標變數 int *pi;有什麼差別? i 只能用來訪問該變數的值,你無法用法其它變數的值。

而pi可以指向任何乙個整形變數,然後訪問它。函式指標的用處也在這,有時候你需要不同的情況呼叫不同的函式,而這多個函式的介面又是一樣的,這個時候你就可以使用函式指標來呼叫。或者用函式指標實現委託,即程式的主邏輯在框架裡,而它只提供了幾個口子寫你的**,這幾個口子就是函式指標,主邏輯呼叫你的**,然後再回去執行它的。

當然,這些都是面向過程的思想。在物件導向裡,有類的多型性了。

c++怎麼定義乙個指向函式的指標?

4樓:

具體例子

int main()

void fun(int a)

{}因為函式的呼叫是需要一定的開銷的,當乙個函式經常被呼叫的時候,如果函式只有幾行,這樣我們可以通過inline函式來解決函式呼叫開銷的問題。

但是如果函式有很多行且經常呼叫,那麼,我們可以通過函式指標來解決函式呼叫開銷的問題

5樓:

c++指向函式的指標定義方式為:

返回型別 (*指標名)(函式引數列表),例如 void (*p)(int)是指向乙個返回值為void 引數為int型別的函式。

而若想定義乙個指向類成員函式的函式指標該怎麼定義呢?對成員函式指標的使用。

(1)非靜態成員函式

定義方式:返回型別 (類名::*指標名)(函式引數列表)例如void (a::*p)(int)是乙個指向a類中成員函式的函式指標。

賦值方式:p=&a::函式名,而一般的函式指標的賦值是p=函式名即可,注意區別。(成員函式必須是public型別的)

呼叫方式:成員函式指標的呼叫必須通過類物件進行呼叫,a.*p(int)即可呼叫成員函式(該成員函式是public型別的)

(2)靜態成員函式

對於靜態成員函式的定義和使用方法都與普通函式指標的相同,只是在賦值的時候和非靜態成員們函式指標的賦值方法相同。

因為靜態成員函式的指標型別是與普通函式指標型別相同的。

6樓:匿名使用者

void test1() {}

typedef void (*functype1)(); //普通函式指標型別定義

//呼叫

functype1 f1 = &test1; //或f1 = test1;

f1(); //普通函式呼叫

c++中int(*ptr)();這是什麼意思啊 ptr貌似是指標後面的空括號什麼意思?答案說p是指向乙個函式的指標?

7樓:ok洛陽水席

每乙個函式都有乙個入口位址,該入口位址就是函式指標所指向的位址。

函式指標的宣告方法為:

函式型別 (標誌符指標變數名) (形參列表);

注1:「函式型別」說明函式的返回型別,「(標誌符指標變數名 )」中的括號不能省,若省略整體則成為乙個函式說明,說明了乙個返回的資料型別是指標的函式,後面的「形參列表」表示指標變數指向的函式所帶的引數列表。例如:

int func(int x); /* 宣告乙個函式 */

int (*f) (int x); /* 宣告乙個函式指標 */

f=func; /* 將func函式的首位址賦給指標f */

賦值時函式func不帶括號,也不帶引數,由於func代表函式的首位址,因此經過賦值以後,指標f就指向函式func(x)的**的首位址。

函式型別要對應,引數列表也要對應。

int(*ptr)();就是指向乙個返回值為int,引數為空的函式的!

參考資料

8樓:

定義乙個函式指標 int(*ptr)() , 所有 int function(void) 型別的函式都可以被這個函式指標引用,也就是無引數,返回int的函式都可以寫。。。 只要你寫 ptr=function 之後 ptr()和function()是同樣的結果。。。。如果有多個函式 f1() f2() f3()

你寫 ptr=f1; ptr(); 呼叫的是f1()。。。 寫ptr=f3(),呼叫的是f3(),函式指標的用處更多的是用於函式**,把自己的指標給另乙個物件,他會在滿足條件時呼叫該函式,這種應用非常多,我們的所有程式的介面控制,比如鍵盤滑鼠控制本質上都是函式**,比如鍵盤控制某函式呼叫,就向鍵盤訊息處理程式傳送函式指標,等待按鍵時改程式會呼叫該函式,實現鍵盤控制。。。。

9樓:翱翔

你應該檢視一下指標函式和函式指標的區別,教材上應該有的!

c++ 中指向函式的指標初始化和使用

10樓:牽著你的手

c++指向函式的指標定義方式為:

返回型別 (*指標名)(函式引數列表),例如 void (*p)(int)是指向乙個返回值為void 引數為int型別的函式。

而若想定義乙個指向類成員函式的函式指標該怎麼定義呢?對成員函式指標的使用。

(1)非靜態成員函式

定義方式:返回型別 (類名::*指標名)(函式引數列表)例如void (a::*p)(int)是乙個指向a類中成員函式的函式指標。

賦值方式:p=&a::函式名,而一般的函式指標的賦值是p=函式名即可,注意區別。(成員函式必須是public型別的)

呼叫方式:成員函式指標的呼叫必須通過類物件進行呼叫,a.*p(int)即可呼叫成員函式(該成員函式是public型別的)

(2)靜態成員函式

對於靜態成員函式的定義和使用方法都與普通函式指標的相同,只是在賦值的時候和非靜態成員們函式指標的賦值方法相同。

因為靜態成員函式的指標型別是與普通函式指標型別相同的。

11樓:

1.a 2.d

都正確的原因是,p=f時會進行隱式型別轉換,f被轉換成指標型別p=&f我就不解釋了,指標賦值很明顯

再乙個void f( ) ;不是宣告,是定義void f();這才是宣告

下面兩個不會

12樓:匿名使用者

詳見:《指標的藝術》

ps:台灣作者寫的。你買本看看

c#委託和c/c++指向函式的指標的區別

13樓:匿名使用者

委託類似於 c/c++ 函式指標指向(理解代表或者儲存)簽名(指函式返回值及引數列表)與函式指標所指定簽名相同函式

委託同之處於委託僅僅類換句說當需要實際使用委託進行操作時只能對物件(例項)進行操作;

並且委託只指向單方法多簽名相同方法都被指向

並且委託類似於集合(種類似於陣列東西儲存容量自動增長)對註冊了方法(已指向)進行解指向操作(登出)樣被登出方法會被委託所使用了

委託特定於當呼叫委託(按照方法呼叫語法呼叫)所有繫結了該委託方法都會被按照繫結順序呼叫

下面定義委託**(無法直接使用因類):

// 函式返回值 委託類名(引數列表);

void dosomethinginorder(int a, int b);

了能夠使用委託 dosomethinginorder需要例項化:

// 例項化多次每被例項化委託物件都各自擁有同被繫結方法列表

dosomethinginorder a;

dosomethinginorder b;

我們需要向委託物件 a 及 b 註冊簽名與些物件委託型別指定簽名相同方法:

// 下兩方法簽名與委託 dosomethinginorder 所指定簽名相同

void dosomethinga(int a, int b)

", new random().next(a, b));

}void dosomethingb(int a, int b)

// 假設裡當前**上下位執行緒會被執行方法體內

a += new dosomethinginorder(dosomethinga); // 通過委託類已過載 += 操作符向委託物件繫結特定方法而被繫結物件型別委託型別構造方法引數方法名

a += dosomethingb; // 需要顯式呼叫構造方法通過方法組語言轉換直接提供方法名即繫結

b += dosomethinga; // 委託物件 b 自己擁有方法列表

a(1, 7); // 呼叫委託物件並提供引數(int a, int b)

b(3, 9); // 同上

終程式輸出結下(當前專案控制台應用程式):

dosomethinga: 3

來自 dosomethingb 訊息

dosomethinga: 8

而委託還有種特殊程式設計方式稱協變和逆變具體去 msdn 搜尋下