亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言詳解函數(shù)與指針的使用

 更新時(shí)間:2022年04月18日 11:58:36   作者:清風(fēng)自在 流水潺潺  
C語言這門課程在計(jì)算機(jī)的基礎(chǔ)教學(xué)中一直占有比較重要的地位,然而要想突破C語言的學(xué)習(xí),對(duì)函數(shù)和指針的掌握是非常重要的,本文將具體針對(duì)函數(shù)和指針的關(guān)系做詳盡的介紹

一、函數(shù)類型

C 語言中的函數(shù)有自己特定的類型

函數(shù)的類型由返回值,參數(shù)類型和參數(shù)個(gè)數(shù)共同決定,如 int add(int i, int j)的類型為 int(int, int)

C 語言中通過 typedef 為函數(shù)類型重命名

typedef type name(parameter list)

typedef int f(int, int);

typedef void p(int);

二、函數(shù)指針

函數(shù)指針用于指向一個(gè)函數(shù)

函數(shù)名是執(zhí)行函數(shù)體的入口地址

可通過函數(shù)類型定義函數(shù)指針:FuncType* pointer;

也可以直接定義: type (*pointer)(parameter list);

  • pointer 為函數(shù)指針變量名
  • type為所指函數(shù)的返回值類型
  • parameter list 為所指函數(shù)的參數(shù)類型列表

下面看一個(gè)函數(shù)指針使用的代碼:

#include <stdio.h>
 
typedef int(FUNC)(int);
 
int test(int i)
{
    return i * i;
}
 
void f()
{
    printf("Call f()...\n");
}
 
int main()
{
    FUNC* pt = test;
    void(*pf)() = &f;
    
    printf("pf = %p\n", pf);
    printf("f = %p\n", f);
    printf("&f = %p\n", &f);
    
    pf();
    
    (*pf)();
    
    printf("Function pointer call: %d\n", pt(2));
    
    return 0;
}
 

輸出結(jié)果如下:

注意:

1.FUNC* pt = test; 是合法的,test 這個(gè)函數(shù)名代表的是函數(shù)的入口地址,

2.對(duì)于函數(shù)名來說,取不取地址沒有區(qū)別,例如上面代碼中的 FUNC* pt = test; 也可以寫成FUNC* pt = &test;

3.(*pf)(); 相當(dāng)于 f();

如果我們把void(*pf)() = &f; 改成void(*pf)() = 0x8048400; 直接利用函數(shù)指針跳轉(zhuǎn)到 0x8048400 這個(gè)地址來執(zhí)行,結(jié)果照樣也能正常輸出:

面試小問題:如何使用 C 語言直接跳轉(zhuǎn)到某個(gè)固定的地址開始執(zhí)行?

答案:通過函數(shù)指針

三、回調(diào)函數(shù)

回調(diào)函數(shù)是利用函數(shù)指針實(shí)現(xiàn)的一種調(diào)用機(jī)制

回調(diào)機(jī)制原理

  • 調(diào)用者不知道具體事件發(fā)生時(shí)需要調(diào)用的具體函數(shù)
  • 被調(diào)函數(shù)不知道何時(shí)被調(diào)用,只知道需要完成的任務(wù)
  • 當(dāng)具體事件發(fā)生時(shí),調(diào)用者通過函數(shù)指針調(diào)用具體函數(shù)

回調(diào)機(jī)制中的調(diào)用者和被調(diào)函數(shù)互不依賴

下面看一個(gè)回調(diào)函數(shù)的使用示例:

#include <stdio.h>
 
typedef int(*Weapon)(int);
 
void fight(Weapon wp, int arg)
{
    int result = 0;
    
    printf("Fight boss!\n");
    
    result = wp(arg);
    
    printf("Boss loss: %d\n", result);
}
 
int knife(int n)
{
    int ret = 0;
    int i = 0;
    
    for(i=0; i<n; i++)
    {
        printf("Knife attack: %d\n", 1);
        ret++;
    }
    
    return ret;
}
 
int sword(int n)
{
    int ret = 0;
    int i = 0;
    
    for(i=0; i<n; i++)
    {
        printf("Sword attack: %d\n", 5);
        ret += 5;
    }
    
    return ret;
}
 
int gun(int n)
{
    int ret = 0;
    int i = 0;
    
    for(i=0; i<n; i++)
    {
        printf("Gun attack: %d\n", 10);
        ret += 10;
    }
    
    return ret;
}
 
int main()
{
    fight(knife, 3);
    fight(sword, 4);
    fight(gun, 5);
    
    return 0;
}
 

輸出結(jié)果如下:

四、小結(jié)

  • C 語言中的函數(shù)都有特定的類型
  • 可以使用函數(shù)類型定義函數(shù)指針
  • 函數(shù)指針是實(shí)現(xiàn)回調(diào)機(jī)制的關(guān)鍵技術(shù)
  • 通過函數(shù)指針可以在 C 程序中實(shí)現(xiàn)固定地址跳轉(zhuǎn)

到此這篇關(guān)于C語言詳解函數(shù)與指針的使用的文章就介紹到這了,更多相關(guān)C語言 函數(shù)與指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c語言?數(shù)據(jù)存儲(chǔ)與原碼?反碼?補(bǔ)碼詳細(xì)解析

    c語言?數(shù)據(jù)存儲(chǔ)與原碼?反碼?補(bǔ)碼詳細(xì)解析

    不知道你是否和我一樣好奇,學(xué)習(xí)編程語言的同時(shí)想,各個(gè)數(shù)據(jù)類型是怎樣在我們的內(nèi)存中儲(chǔ)存的呢,如果你仔細(xì)深入了解的話,你會(huì)了解其中的樂趣,了解科學(xué)家們的偉大,了解c語言
    2022-02-02
  • C語言開發(fā)實(shí)現(xiàn)貪吃蛇游戲

    C語言開發(fā)實(shí)現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了C語言開發(fā)實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 詳解C語言數(shù)組靈活多變的訪問形式

    詳解C語言數(shù)組靈活多變的訪問形式

    這篇文章主要介紹了詳解C語言數(shù)組靈活多變的訪問形式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C語言中輸入函數(shù)(scanf()、fgets()和gets())的區(qū)別詳解

    C語言中輸入函數(shù)(scanf()、fgets()和gets())的區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于C語言中三種輸入函數(shù)(scanf()、fgets()和gets())區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • C++ float、double判斷是否等于0問題

    C++ float、double判斷是否等于0問題

    這篇文章主要介紹了C++ float、double判斷是否等于0問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • C++多態(tài)實(shí)現(xiàn)方式詳情

    C++多態(tài)實(shí)現(xiàn)方式詳情

    這篇文章主要介紹了C++多態(tài)實(shí)現(xiàn)方式詳情,多態(tài)是一種面向?qū)ο蟮脑O(shè)計(jì)思路,本身和C++不是強(qiáng)綁定的,其他語言當(dāng)中一樣有多態(tài),只不過實(shí)現(xiàn)的方式可能有所不同。下面來一起了解更多詳細(xì)內(nèi)容吧
    2022-01-01
  • C++?自定義單向鏈表?ListNode詳情

    C++?自定義單向鏈表?ListNode詳情

    這篇文章主要介紹了C++?自定義單向鏈表?ListNode詳情,文章將介紹鏈表中不帶頭結(jié)點(diǎn),沒有存放鏈表長(zhǎng)度的節(jié)點(diǎn),從頭結(jié)點(diǎn)開始就存放數(shù)據(jù)得一種,具有一定得參考價(jià)值,需要的小伙伴可以參考一下
    2022-03-03
  • Qt使用TabWidget實(shí)現(xiàn)多窗體功能

    Qt使用TabWidget實(shí)現(xiàn)多窗體功能

    Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,本章將重點(diǎn)介紹TabWidget標(biāo)簽組件的常用方法及靈活運(yùn)用,需要的朋友可以參考下
    2023-12-12
  • 老生常談C語言中指針的使用

    老生常談C語言中指針的使用

    這篇文章主要為大家詳細(xì)介紹了C語言中指針的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C語言實(shí)現(xiàn)航班訂票系統(tǒng)

    C語言實(shí)現(xiàn)航班訂票系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)航班訂票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12

最新評(píng)論