中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言結構體中怎么實現函數成員以及回調函數

發布時間:2021-11-22 14:58:06 來源:億速云 閱讀:807 作者:iii 欄目:互聯網科技

這篇文章主要講解了“C語言結構體中怎么實現函數成員以及回調函數”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C語言結構體中怎么實現函數成員以及回調函數”吧!

往往我們在寫程序時,比如定義了某一個“對象”(注意這里不是指C++,C#,Java等高級語言中的對象概念)。如在C語言中定義了一個用作顯示器初始化的對象,這里定義了一個內部成員變量int width,這個變量表示了當前系統中顯示器的寬度,另一個變量為int height,這個變量表示了當前系統中顯示器的高度。除了這兩個常規的變量之外,我們在對顯示器初始化時,會調用到函數“ScreenInit(intwidth, int height);”。

對于上述的應用中,如果是簡單的單一顯示器是完全沒有任何問題的,但是當我們這個程序需要去被外界移植的時候,每個顯示器除了有不同的width和height之外,其初始化函數也可能不同。對于這種應用,我們希望這個初始化函數也被包含在整個“對象”中,這樣在移植的時候,我們除了定義顯示器的長度,寬度之外,再重新寫一個顯示器的初始化函數,即可以非常方便地將這個顯示器驅動移植過去。

除了上述這個應用之外,再比如,我們在寫一個嵌入式芯片的框架程序時候,可以將每一個新建的任務定義成一個結構體,這個結構體里面包含了這個任務的調度時間,優先級,堆棧大小,以及具體的任務代碼。

上述的兩種應用中,除了我們定義結構體的普通成員變量之外,還需要在結構體里面定義一個非常重要的元素,即函數。而我們前面已經明確交代過C語言的結構體中是不能支持函數的,那么我們能否想一個辦法出來讓C語言的結構體可以去嵌入一個函數功能的成員進去呢?答案顯然是可以的,因為C語言的結構體內部雖然無法去直接定義一個函數,但是C語言結構體內部的成員明確可以為一個指針,我們前面說了,C語言的指針可以指向一切具有地址的東西。

因此,要在C語言結構體中實現函數成員的思路就變得很明了了,即:

在C語言結構體內部定義一個指向函數的指針;

在具體“對象”初始化的時候,將結構體中的指向函數的指針指向具體實現功能的函數;

在這個函數需要調用時進行調用。

以上就是關于C語言結構體中實現函數成員的方法,如圖1所示。

 C語言結構體中怎么實現函數成員以及回調函數

圖1 C語言結構體中實現函數

再補充一點,上述這種原理,先將指向函數的指針指向具體的實現函數,后面再來統一調用,這種方式就是我們在C語言里面常說的回調函數。回調函數的應用有很多,比如當我們在做單片機中斷的時候,就可以將單片機中斷處理函數寫成一個指向函數的指針,在每次單片機程序初始化的時候,將中斷里面的函數指針指向具體的中斷處理函數,等到中斷產生的時候,單片機就可以去調用這個指向函數的指針了。而在程序運行的時候,我們也可以隨時去修改這個指向函數的指針指向的對象,使程序更加靈活。

接下來,我們來寫一些代碼說明一下C語言結構體中實現函數成員。這里有一個實例,寫一個程序,根據輸入計算一個長方形的周長或者面積,假設鍵盤輸入的數字為1,就計算這個長方形的周長,假設鍵盤輸入的數字為0,就計算這個長方形的面積。

上述的這個程序可以有無數種做法,由于今天我們主要講述結構體和回調函數,那么我們就使用這兩個知識點來編寫程序。

首先要做的就是為這個長方形定義一個可以存儲它所有相關變量的結構體,我們想一下,這個結構體用來描述長方形,長方形的兩個最關鍵的信息就是它的長度和寬度,因此這個結構體中一定要包含這兩個信息。然后,我們的要求是要計算這個長方形的周長和面積,所以我們也可以將這兩個變量一并定義在結構體里面,當然如果不想定義進結構體也沒問題。接著我們要求是需要同時求這個長方形的面積和周長,因此我們可以為這個結構體定義一個指向函數的指針,根據不同的選項來修改這個指針指向的函數。最后,根據輸入需要,修改這個結構體中指向函數的指針指向的函數,然后調用即可。因此可以寫出如圖2的程序。

C語言結構體中怎么實現函數成員以及回調函數

圖2 結構體內嵌函數成員的應用

感謝各位的閱讀,以上就是“C語言結構體中怎么實現函數成員以及回調函數”的內容了,經過本文的學習后,相信大家對C語言結構體中怎么實現函數成員以及回調函數這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

县级市| 合山市| 宜阳县| 苏尼特左旗| 乡城县| 南川市| 益阳市| 固始县| 敦化市| 东丽区| 周至县| 湘乡市| 永定县| 长宁区| 进贤县| 全州县| 杂多县| 通许县| 昆明市| 昌图县| 舞钢市| 京山县| 安龙县| 称多县| 安新县| 保德县| 桐城市| 无锡市| 射阳县| 资讯| 钦州市| 泗水县| 新兴县| 临沂市| 肇东市| 大名县| 潼关县| 渝中区| 新宁县| 彭水| 博爱县|