在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言中函數(shù)指針詳解

CHANBAEK ? 來源:博客園-LSWen ? 作者:博客園-LSWen ? 2023-02-15 14:50 ? 次閱讀

C語言中函數(shù)指針

函數(shù)調(diào)用的方法有兩種分別如下:

void Fun(void)
{
    //do something
}

int main(void)
{
   ...
   Fun();
   ...
   return 0;
}
void Fun(void)
{
  //do something
}

int main(void)
{
   ...
   void (*p)(void);
   p=Fun;
   p();    
   return 0;
}

上面兩種方式都可以調(diào)用函數(shù),第二種方式在回調(diào)函數(shù)中用的最多,尤其是在操作系統(tǒng)的任務(wù)切換中。 那么我們就重點來分析下第二種方式。

第二種方式申明了一個函數(shù)指針p,那為啥寫成void(p)(void)? 為啥不直接寫成p,不是說了函數(shù)名就是該函數(shù)的入口地址,為啥不直接把該地址傳給指針呢,這樣既好理解又方便省事,其實這樣想不無道理,但是在C語言中有變量類型這個東東,比如int賦值給char,編譯器就會報錯,同樣的道理函數(shù)也有類型,那么既然函數(shù)有類型,我們?nèi)绾沃雷兞款愋湍亍?現(xiàn)在寫一個程序如下,注意,程序有錯誤,這個錯誤是故意寫的,目的就是讓編譯器報錯,使用編譯器為gcc。

#include "stdio.h"

void Fun(void)
{
    printf("hello world");    
}

int main(void)
{
    void *p;
        p=Fun;
    return 0;
}

下面是編譯器輸出:

g++.exe -x c++ -c C:\\Users\\Administrator.SC-201903191934\\Desktop\\unknown1.c -o C:\\Users\\Administrator.SC-201903191934\\Desktop\\unknown1.o -Wall -fallowive -Wno-sign-compare -g

C:\\用戶\\管理員.SC-201903191934\\桌面\\未知1.c:在函數(shù)中 int main()':** **C:\\Users\\Administrator.SC-201903191934\\Desktop\\unknown1.c:12: warning: invalid conversion from 空 ( )()' 改為 '無效 '

編譯器報錯意思是不能講void ( )()類型轉(zhuǎn)化為void 類型。 這個警告就說明了函數(shù)Fun的類型是( )()類型,而申明的指針類型是 ,兩個類型不一致,故導(dǎo)致其錯誤,既然這樣,那么如何申請一個指針類型為( )()的呢? C語言中給了函數(shù)指針這個類型,即( )()類型,因此為了讓指針指向一個函數(shù)地址,只需要聲明一個(*)()類型即可。

如下:

#include "stdio.h"

void Fun(void)
{
    printf("hello world"); 

 } 

int main(void)
 {
void (*p)(void); //函數(shù)指針
     p=Fun; return 0;
 }

這樣就將函數(shù)Fun的地址給指針p了,與其說p是一個函數(shù)指針,倒不如說p是一個函數(shù)名,只是沒有什么其函數(shù)內(nèi)部,這里可以從舊式的函數(shù)申明上可以看出。

因此要運行這個所謂的函數(shù)p,只需要和函數(shù)使用一樣就行,p();

現(xiàn)在再來看一個代碼:

void *Fun(void)
{
    printf("hello world");    
    return NULL;
}

這里函數(shù)Fun改為了有返回值的函數(shù),其返回值為指針void *類型,那么我們?nèi)绾蝸砺暶饕粋€指針指該函數(shù)呢?

從上門面分析可以看出,該函數(shù)的類型應(yīng)該是*(*)(); 所以現(xiàn)在我們需要聲明一個相同類型的指針,即void *(*p)(void); 這樣就只需要p=Fun; 就可以達(dá)到目的了。

#include "stdio.h"

void *Fun(void)
{
    printf("hello world");    
    return NULL;
}

int main(void)
{
    void *(*p)(void);
    p=Fun;
    return 0;
}

**總結(jié):

函數(shù)名也是有類型的,因此在C語言中,必須嚴(yán)格遵守類型匹配原則。
函數(shù)名的類型為(*)()類型,如果有返回值,則在最前面增加返回類型即可,例如
int * Fun(int,int ); 其函數(shù)類型為 ()(int,int),對應(yīng)的函數(shù)指針為int **(*p)(int,int);

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7624

    瀏覽量

    139510
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4363

    瀏覽量

    63710
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    484

    瀏覽量

    70881
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1651

    瀏覽量

    49691
  • 回調(diào)函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    88

    瀏覽量

    11778
收藏 人收藏

    評論

    相關(guān)推薦

    C語言中void指針的基本認(rèn)識及典型應(yīng)用

    C語言中,*類型就是指針類型,比如 int *p,double *q,雖然是不一樣的指針,但是大小卻一樣sizeof(p) == sizeof(q),因為它們都是同一種類型*類型的。
    發(fā)表于 02-01 09:26 ?1245次閱讀

    C語言中指針函數(shù)函數(shù)指針的概念及應(yīng)用示例

    C語言中指針函數(shù)函數(shù)指針是強大且常用的工具。它們允許我們以更靈活的方式處理
    發(fā)表于 08-16 16:14 ?1399次閱讀

    C語言中多級指針的概念和使用方法

    多級指針C語言中是一種特殊的指針類型,它可以指向其他指針指針
    發(fā)表于 08-16 16:16 ?1363次閱讀

    c語言指針詳解

    不同,有4字節(jié)或者8字節(jié)或者其他可能)。  第二,指針使得一些復(fù)雜的鏈接性的數(shù)據(jù)結(jié)構(gòu)的構(gòu)建成為可能,比如鏈表,鏈?zhǔn)蕉鏄涞鹊取! 〉谌行┎僮鞅仨毷褂?b class='flag-5'>指針。如操作申請的堆內(nèi)存。還有:C語言中
    發(fā)表于 03-26 09:51

    C語言中指針是什么?如何規(guī)避野指針

    C語言中指針是什么?有哪幾種類型?指針有何作用?如何規(guī)避野指針
    發(fā)表于 02-25 06:47

    C語言中指針的介紹非常詳細(xì)

    C語言中指針的介紹非常詳細(xì) C語言中指針的介紹非常詳細(xì)
    發(fā)表于 12-25 10:39 ?57次下載

    C語言指針函數(shù)函數(shù)指針詳細(xì)介紹

    C語言指針函數(shù)函數(shù)指針詳細(xì)介紹。。。。。。。
    發(fā)表于 03-04 15:27 ?5次下載

    C語言指針函數(shù)訪問

    C語言指針函數(shù)訪問
    發(fā)表于 12-16 17:23 ?1次下載

    c語言函數(shù)指針定義,指針函數(shù)函數(shù)指針的區(qū)別

     往往,我們一提到指針函數(shù)函數(shù)指針的時候,就有很多人弄不懂。下面就由小編詳細(xì)為大家介紹C語言中
    發(fā)表于 11-16 15:18 ?3822次閱讀

    C語言的精髓——指針詳解

    C語言的精髓——指針詳解
    發(fā)表于 11-30 14:43 ?17次下載

    C語言中的野指針是怎么來的?

    )、malloc函數(shù)申請堆內(nèi)存返回的地址(但未使用free釋放,是在堆空間動態(tài)申請) 需要注意的是,野指針不是NULL指針,通常NULL指針可以使用if語句來判斷,但是
    的頭像 發(fā)表于 06-01 16:43 ?2685次閱讀

    C語言中指針(重點)超詳細(xì)

    C語言中指針1、指針是什么2、指針指針類型2.1、指針
    發(fā)表于 01-13 14:10 ?11次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>的<b class='flag-5'>指針</b>(重點)超詳細(xì)

    C語言中什么是指針數(shù)組

    C語言中一個數(shù)組,若其元素均為指針類型數(shù)據(jù),稱為指針數(shù)組,也就是說,指針數(shù)組中的每一個元素都存放一個地址,相當(dāng)于一個
    的頭像 發(fā)表于 03-10 15:26 ?2070次閱讀

    簡述C語言中指針重點

    C語言中一個函數(shù)可以返回一個整型值、字符值、實型值等,也可以返回指針型的數(shù)據(jù),即地址,其概念與以前類似,只是返回的值的類型是指針類型。
    的頭像 發(fā)表于 03-10 15:28 ?727次閱讀

    c語言指針用法詳解:如何使用指針變量做函數(shù)參數(shù)

    指針C語言中一個比較重要的東西,有人說指針C語言的靈魂這句話說的一點也沒錯。 正確靈活地運用
    發(fā)表于 09-21 12:32 ?1326次閱讀
    <b class='flag-5'>c</b><b class='flag-5'>語言</b><b class='flag-5'>指針</b>用法<b class='flag-5'>詳解</b>:如何使用<b class='flag-5'>指針</b>變量做<b class='flag-5'>函數(shù)</b>參數(shù)
    主站蜘蛛池模板: 婷婷综合久久中文字幕蜜桃三 | 午夜毛片视频高清不卡免费 | 人人爽天天爽夜夜爽曰 | 欧美大片一区二区 | 成人人免费夜夜视频观看 | 视频在线观看高清免费看 | 欧美极品 | 在线www天堂资源网 在线播放 你懂的 | 亚洲黄色网址在线观看 | 波多野结衣在线视频免费观看 | 91免费视频网站 | 午夜在线视频国产 | 欧美a一级| 天天天天操 | 男同小黄文 | 日本在线亚洲 | 九九热re| 精品黄色录像 | 色婷婷色| 无毒不卡在线播放 | 轻点太大了好深好爽h文 | 欧美性黄色 | 天天爽天天干天天操 | 在线欧美国产 | 久久波多野结衣 | 两性色午夜视频自由成熟的性 | 国产三级在线播放 | 亚洲精品视频区 | 男人j进女人j的一进一出视频 | 欧美二级| 日本三级理论 | 亚洲二区视频 | 在线欧美色图 | 欧美色人阁 | 91操视频 | 乱码精品一区二区三区 | 男人操女人视频免费 | h视频在线免费观看 | 亚洲成a人片77777潘金莲 | 日本人爽p大片免费看 | 天天爽夜夜爽一区二区三区 |