日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言——结构体

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言——结构体 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C語言——結構體


宗旨:技術的學習是有限的,分享的精神是無限的。


1、結構體的作用:個人理解,結構體就是把一堆相關的數據打包成一個結構,使其放在一塊內存區域?!椖恐斜M量使用結構體,而不要單獨使用數組。

?

2、結構體的聲明與定義

規范:

1)如果此結構體在多個文件中使用就放在頭文件中(.h文件中);如果此結構體只在本文件中使用,則放在源文件中(.c文件中),并加以static限定。

2)如果是用typedef起別名,則以_t作為后綴;如果是用static限定的則不用_t后綴。

typedef __packed struct {uint8_t datetime[6]; // 年月日,時分秒 (BCD) -- 連續駕駛開始/結束時間int16_t altitude; // 海拔int32_t longitude; // 經度int32_t latitude; // 緯度 } gbt19056_fatigue_info_t;// __packed表示一字節對齊,單片機編程中常用 // gbt19056_fatigue_info_t相當于類型名,類似于int,float之類的static struct {rtc_timer_t timer_check;uint16_t attr; // 區域屬性ca8gps_event_data_t event; } t808_area;

結構體聲明的時候一定要注意字節對齊的問題,加上__packed為了一字節對齊,否則默認是4字節對齊的。

定義和聲明:定義分配內存,聲明不分配內存。

?

3、結構體的初始化接口

規范:函數名大寫的是對外接口,函數名全小寫加下劃線的是對內接口。

typedef重命名的要先定義一個變量,然后再使用,如下:

gbt19056_fatigue_info_t info1; // 訪問則是info1.altitude = 0x012;

gbt19056_fatigue_info_t *info2; // 訪問則是info2->altitude = 0x012;

static限定的則直接使用,t808_area. attr = 0x55;

一般項目中要寫初始化函數:

void gbt19056_fatigue_init(void) {memset(&info, 0, sizeof(gbt19056_fatigue_info_t));memcpy(info2->datetime, date, sizeof(info2->datetime));info2->altitude = 0;info2->longitude = 0x7FFFFFFF;info2->latitude = 0x7FFFFFFF; }


4、結構體訪問接口

比較大型一點的項目之中,多個文件會用到一些結構中的成員,因此寫成接口形式。

規范:一般少使用全局變量,需要某些值的時候以函數接口形式給予。

uint16_t T808AreaAddr(void) {return t808_area. attr; }void GBT19056FatigueTime(char *data) {memcpy(data, info2->datetime, sizeof(info2->datetime)); }


5、結構體中一些技巧

處理批量類似事情:

// 一個命令字對應一個處理函數,用for循環掃描 // 命令字有的用枚舉, 有的用宏 typedef enum {T808_CUSTOM_CAMERA_COUNT = 1,T808_CUSTOM_DISTANCE_TYPE = 2,T808_CUSTOM_OIL = 3,T808_CUSTOM_VERSION = 4 } t808_t; // 再三強調,起別名的類型一定要加_t后綴以示區分 typedef uint8_t (*handler_t)(char *data, uint8_t length);typedef struct { // 變量類型和函數參數隨機應變uint8_t cmd;uint8_t length;handler_t hander; } t808_custom_entry_t ;static uint8_t t808_custom_camera_count(char *data, uint8_t length); static uint8_t t808_custom_disdance _type(char *data, uint8_t length); static uint8_t t808_custom_oil(char *data, uint8_t length); static uint8_t t808_custom_version(char *data, uint8_t length);//=========================================================== // 定義好結構之后,用數組裝載整個命令及其處理函數 static const t808_custom_entry_t t808_custom_entries[] = {{T808_CUSTOM_CAMERA_COUNT, 1, t808_custom_camera_count},{T808_CUSTOM_DISTANCE_TYPE, 1, t808_custom_disdance _type},{T808_CUSTOM_OIL, 22, t808_custom_oil},{T808_CUSTOM_VERSION, 14, t808_custom_version}, };// 在一個函數中用for循環掃描 static void custom_setting(client_t*client, t808_hdr_t *request, uint16_t length) {t808_custom_entry_t*entry;for(entry = t808_custom_entries; entry->handler; ++entry){if(entry->cmd == request->cmd){entry->handler(data, length); // 只是一個輪廓,僅供參考break;}} }

?

總結

以上是生活随笔為你收集整理的C语言——结构体的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。