色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言中函數指針詳解

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

C語言中函數指針

函數調用的方法有兩種分別如下:

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;
}

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

第二種方式申明了一個函數指針p,那為啥寫成void(p)(void)? 為啥不直接寫成p,不是說了函數名就是該函數的入口地址,為啥不直接把該地址傳給指針呢,這樣既好理解又方便省事,其實這樣想不無道理,但是在C語言中有變量類型這個東東,比如int賦值給char,編譯器就會報錯,同樣的道理函數也有類型,那么既然函數有類型,我們如何知道變量類型呢。 現在寫一個程序如下,注意,程序有錯誤,這個錯誤是故意寫的,目的就是讓編譯器報錯,使用編譯器為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:在函數中 int main()':** **C:\\Users\\Administrator.SC-201903191934\\Desktop\\unknown1.c:12: warning: invalid conversion from 空 ( )()' 改為 '無效 '

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

如下:

#include "stdio.h"

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

 } 

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

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

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

現在再來看一個代碼:

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

這里函數Fun改為了有返回值的函數,其返回值為指針void *類型,那么我們如何來聲明一個指針指該函數呢?

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

#include "stdio.h"

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

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

**總結:

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137398
  • 函數
    +關注

    關注

    3

    文章

    4344

    瀏覽量

    62864
  • 指針
    +關注

    關注

    1

    文章

    481

    瀏覽量

    70593
  • 編譯器
    +關注

    關注

    1

    文章

    1642

    瀏覽量

    49229
  • 回調函數
    +關注

    關注

    0

    文章

    87

    瀏覽量

    11606
收藏 人收藏

    評論

    相關推薦

    C語言中void指針的基本認識及典型應用

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

    C語言中指針函數函數指針的概念及應用示例

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

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

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

    c語言指針詳解

    不同,有4字節或者8字節或者其他可能)。  第二,指針使得一些復雜的鏈接性的數據結構的構建成為可能,比如鏈表,鏈式二叉樹等等。  第三,有些操作必須使用指針。如操作申請的堆內存。還有:C語言中
    發表于 03-26 09:51

    C語言中指針是什么?如何規避野指針

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

    C語言中指針的介紹非常詳細

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

    C語言指針函數函數指針詳細介紹

    C語言指針函數函數指針詳細介紹。。。。。。。
    發表于 03-04 15:27 ?5次下載

    C語言指針函數訪問

    C語言指針函數訪問
    發表于 12-16 17:23 ?1次下載

    c語言函數指針定義,指針函數函數指針的區別

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

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

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

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

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

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

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

    C語言中什么是指針數組

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

    簡述C語言中指針重點

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

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

    指針C語言中一個比較重要的東西,有人說指針C語言的靈魂這句話說的一點也沒錯。 正確靈活地運用
    發表于 09-21 12:32 ?1141次閱讀
    <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'>函數</b>參數
    主站蜘蛛池模板: 亚洲精品视频免费在线观看| 国产AV精品久久久毛片| 久久AV国产麻豆HD真实乱| 中文字幕日本一区| 欧美男男网站免费观看videos| 白洁在线观看| 性感尼姑风流寺| 两个人的视频免费| 国产 日韩 欧美 综合 激情| 亚洲色噜噜狠狠站欲八| 欧美久久综合网| 国产一区二区在线免费观看| 52色擼99热99| 校花被扒衣吸乳羞羞漫画| 麻豆天美国产一区在线播放| 国产黄大片在线视频| 在线亚洲黄色| 跳蛋按摩棒玉势PLAY高H| 看美女大腿中间的部分| 大肥女ass樱桃| 中文有码中文字幕免费视频| 色-情-伦-理一区二区三区| 久久精品亚洲| 国产精品成人免费观看| 5G在线观看免费年龄确认18| 午夜视频在线瓜伦| 内地同志男16china16| 国语自产二区高清国语自产拍| beeg日本高清xxxx| 一久久| 天美传媒色情原创精品| 美女裸露胸部100%无遮挡| 国产免费网站看v片在线| chinesedaddy80老年人| 一本到2v不卡区| 无罩看奶禁18| 青青草国产精品| 浪荡受自我调教纯肉BL| 国产中文字幕乱码免费| 俄罗斯aaaa一级毛片| 97亚洲狠狠色综合久久久久|