新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 漫談c語言結構體

        漫談c語言結構體

        作者: 時間:2016-12-01 來源:網絡 收藏
        相信大家對于結構體都不陌生。在此,分享出本人對C語言結構體的研究和學習的總結。如果你發現這個總結中有你以前所未掌握的,那本文也算是有點價值了。當然,水平有限,若發現不足之處懇請指出。代碼文件test.c我放在下面。

        在此,我會圍繞以下2個問題來分析和應用C語言結構體:

        本文引用地址:http://www.104case.com/article/201612/324476.htm

        1.C語言中的結構體有何作用

        2.結構體成員變量內存對齊有何講究(重點)

        對于一些概念的說明,我就不把C語言教材上的定義搬上來。我們坐下來慢慢聊吧。

        ==============================================================================================================================================

        1.結構體有何作用

        三個月前,教研室里一個學長在華為南京研究院的面試中就遇到這個問題。當然,這只是面試中最基礎的問題。如果問你你怎么回答?

        我的理解是這樣的,C語言中結構體至少有以下三個作用:

        (1)有機地組織了對象的屬性。

        比如,在STM32的RTC開發中,我們需要數據來表示日期和時間,這些數據通常是年、月、日、時、分、秒。如果我們不用結構體,那么就需要定義6個變量來表示。這樣的話程序的數據結構是松散的,我們的數據結構最好是“高內聚,低耦合”的。所以,用一個結構體來表示更好,無論是從程序的可讀性還是可移植性還是可維護性皆是:

        typedefstruct//公歷日期和時間結構體

        {

        vu16 year;

        vu8 month;

        vu8 date;

        vu8hour;

        vu8min;

        vu8sec;

        }_calendar_obj;

        _calendar_objcalendar;//定義結構體變量

        (2)以修改結構體成員變量的方法代替了函數(入口參數)的重新定義。

        如果說結構體有機地組織了對象的屬性表示結構體“中看”,那么以修改結構體成員變量的方法代替函數(入口參數)的重新定義就表示了結構體“中用”。繼續以上面的結構體為例子,我們來分析。假如現在我有如下函數來顯示日期和時間:

        voidDsipDateTime(_calendar_objDateTimeVal)

        那么我們只要將一個_calendar_obj這個結構體類型的變量作為實參調用DsipDateTime()即可,DsipDateTime()通過DateTimeVal的成變量來實現內容的顯示。如果不用結構體,我們很可能需要寫這樣的一個函數:

        voidDsipDateTime(vu16 year,vu8 month,vu8 date,vu8hour,vu8min,vu8sec)

        顯然這樣的形參很不可觀,數據結構管理起來也很繁瑣。如果某個函數的返回值得是一個表示日期和時間的數據,那就更復雜了。這只是一方面。

        另一方面,如果用戶需要表示日期和時間的數據中還要包含星期(周),這個時候,如果之前沒有用機構體,那么應該在DsipDateTime()函數中在增加一個形參vu8week:

        voidDsipDateTime(vu16 year,vu8 month,vu8 date,vu8week,vu8hour,vu8min,vu8sec)

        可見這種方法來傳遞參數非常繁瑣。所以以結構體作為函數的入口參數的好處之一就是

        函數的聲明voidDsipDateTime(_calendar_objDateTimeVal)不需要改變,只需要增加結構體的成員變量,然后在函數的內部實現上對calendar.week作相應的處理即可。這樣,在程序的修改、維護方面作用顯著。

        typedefstruct//公歷日期和時間結構體

        {

        vu16 year;

        vu8 month;

        vu8 date;

        vu8 week;

        vu8hour;

        vu8min;

        vu8sec;

        }_calendar_obj;

        _calendar_objcalendar;//定義結構體變量

        (3)結構體的內存對齊原則可以提高CPU對內存的訪問速度(以空間換取時間)。
        并且,結構體成員變量的地址可以根據基地址(以偏移量offset)計算。我們先來看看下面的一段簡單的程序,對于此程序的分析會在第2部分結構體成員變量內存對齊中詳細說明。


        上一頁 1 2 3 下一頁

        關鍵詞: c語言結構

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 华容县| 赞皇县| 安丘市| 合作市| 阿合奇县| 华坪县| 深泽县| 望江县| 美姑县| 类乌齐县| 萝北县| 巨野县| 新干县| 泗水县| 黄平县| 阿坝县| 拉孜县| 阳春市| 南昌县| 松原市| 拜泉县| 察哈| 三台县| 祁门县| 吉木乃县| 伊宁县| 衡南县| 徐汇区| 渭南市| 五大连池市| 扶余县| 屏山县| 桓台县| 永德县| 清水河县| 驻马店市| 墨竹工卡县| 卢龙县| 嘉荫县| 广丰县| 枞阳县|