
一、結構體指針是什么結構體指針是一個指向結構體變量的指針變量它存儲的是結構體變量的內存地址。通過結構體指針我們可以直接訪問結構體的成員而不需要拷貝整個結構體大大節省了內存空間。二、核心語法規則普通結構體變量使用.點號訪問成員例如dev.temp。結構體指針使用-箭頭訪問成員例如p_dev-temp。綁定地址定義結構體指針后必須綁定一個已存在的結構體變量的地址使用取地址符否則會導致程序跑飛。三、基礎代碼示例理解結構體指針我們先看一個最基礎的示例直觀感受結構體指針的使用#include stdio.h // 定義設備結構體 struct Device { int temp; // 溫度 int fan_speed; // 風扇檔位 }; int main(void) { // 定義結構體變量并初始化 struct Device dev {28, 2}; // 定義結構體指針綁定dev的地址 struct Device *p_dev dev; // 通過指針訪問成員 printf(溫度%d℃\n, p_dev-temp); printf(風扇檔位%d\n, p_dev-fan_speed); return 0; }運行結果溫度28℃ 風扇檔位2四、結構體指針的核心優勢節省內存傳遞結構體時只需要傳遞指針4字節而不需要拷貝整個結構體避免了內存浪費。高效訪問直接通過指針訪問結構體成員不需要拷貝數據訪問速度更快。代碼簡潔在大型工程中使用結構體指針可以簡化函數參數傳遞讓代碼更易維護。五、嵌入式實戰場景STM32外設寄存器訪問在STM32開發中外設寄存器通常以結構體的形式定義通過結構體指針可以直接訪問寄存器這是STM32庫的核心設計思想。示例訪問GPIO外設寄存器#include stm32f10x.h // 假設我們要訪問GPIOC的ODR寄存器 void GPIO_Toggle(void) { // 定義GPIO_TypeDef類型的指針指向GPIOC的基地址 GPIO_TypeDef *p_gpio GPIOC; // 通過指針訪問ODR寄存器翻轉第13位LED燈 p_gpio-ODR ^ (1 13); }在STM32的標準庫中GPIO_TypeDef是一個結構體包含了GPIO的所有寄存器GPIOC是這個結構體的基地址通過指針可以直接訪問各個寄存器。六、實戰場景傳感器數據訪問在傳感器驅動開發中傳感器的數據通常以結構體的形式存儲通過結構體指針可以高效地訪問傳感器數據。示例DHT11溫濕度傳感器數據訪問#include stdio.h // 定義DHT11傳感器數據結構體 typedef struct { float temperature; // 溫度 float humidity; // 濕度 uint8_t check_sum; // 校驗和 } DHT11_Data; // 定義傳感器驅動函數返回結構體指針 DHT11_Data *DHT11_ReadData(void) { static DHT11_Data data; // 靜態變量避免函數返回后數據丟失 // 模擬讀取傳感器數據 data.temperature 25.5; data.humidity 60.0; data.check_sum (uint8_t)(data.temperature data.humidity); return data; } int main(void) { // 調用驅動函數獲取傳感器數據指針 DHT11_Data *p_sensor DHT11_ReadData(); // 通過指針訪問傳感器數據 printf(溫度%.1f℃\n, p_sensor-temperature); printf(濕度%.1f%%\n, p_sensor-humidity); return 0; }七、實戰場景設備參數緩存在嵌入式系統中設備參數通常存儲在結構體中通過結構體指針可以高效地訪問和修改參數。示例設備參數管理#include stdio.h #include string.h // 定義設備參數結構體 typedef struct { char device_name[20]; // 設備名稱 int baud_rate; // 波特率 int power_mode; // 電源模式 uint8_t is_connected; // 連接狀態 } Device_Params; // 初始化設備參數 void Device_Init(Device_Params *p_params) { strcpy(p_params-device_name, SmartDevice); p_params-baud_rate 115200; p_params-power_mode 1; p_params-is_connected 0; } int main(void) { Device_Params params; Device_Init(params); // 傳遞結構體指針 // 通過指針訪問參數 printf(設備名稱%s\n, params.device_name); printf(波特率%d\n, params.baud_rate); return 0; }八、使用結構體指針的注意事項必須綁定地址定義結構體指針后必須綁定一個已存在的結構體變量的地址否則會導致程序跑飛。避免野指針不要使用未初始化的指針不要返回局部變量的指針除非使用static修飾。字節對齊結構體的大小可能會因為字節對齊而變大在使用指針訪問時要注意成員的偏移量。九、總結結構體指針是嵌入式C語言中非常實用的技巧它能幫你在STM32外設訪問、傳感器數據處理、設備參數管理等場景中高效地訪問結構體成員節省內存空間簡化代碼邏輯。在大型工程中結構體指針幾乎是必備的技巧掌握它能讓你的嵌入式開發能力更上一層樓。如果你覺得這篇文章對你有幫助歡迎點贊收藏也可以在評論區分享你使用結構體指針的實戰經驗