首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

單片機C語言編程:指針與變量的正確使用指南

     編輯:關於C

指針與變量的關係

在Keil單片機C編程中,指針與變量的正確搭配至關重要。許多初學者容易犯一個錯誤:直接使用未指向具體變量的指針進行操作,導致程序運行混亂甚至崩潰。

錯誤示範:未分配變量直接操作指針

Type *p, *q;
// 直接給指針賦值,但未定義實際變量
// 此時 p 和 q 指向的內存地址是隨機的

這種寫法會導致指針指向不可預測的內存區域,讀寫操作將產生未定義行為。

規範寫法:先定義變量,再讓指針指向

Type *p, *q, pp, qq;
// 先定義實際變量 pp 和 qq
p = &pp;  // 指針指向已分配的變量
q = &qq;

結論: 必須先分配變量內存,再讓指針指向該地址。指針本質上只是存儲地址的變量,若無實際變量存在,指針操作就是在操作隨機內存。

指針自身地址與所指地址的區別

通過一個實際串口調試案例來說明:

rf_packet_info *buff, buffer;

uart_sendbyte(buff);      // 輸出指針 buff 存儲的值(即所指變量地址)
uart_sendbyte(&buff);     // 輸出指針 buff 自身的地址
uart_sendbyte(&buffer);   // 輸出變量 buffer 的地址

buff = &buffer;  // 讓指針指向實際變量

uart_sendbyte(buff);      // 再次輸出
uart_sendbyte(&buff);
uart_sendbyte(&buffer);

運行結果分析

第一次運行:

  • 03 21 27
  • 27 21 27

後續運行:

  • 27 21 27
  • 27 21 27

核心結論

  • uart_sendbyte(buff):指針內存儲的內容(所指變量地址),指向前為隨機值
  • uart_sendbyte(&buff):指針自身的地址(固定不變)
  • uart_sendbyte(&buffer):變量 buffer 的地址(固定不變)

第一次運行時,buff 未初始化指向隨機地址(03),賦值後指向 buffer(27)。指針自身地址(&buff = 21)和變量地址(&buffer = 27)始終不變。

最佳實踐建議

  1. 定義即初始化: 声明指針時立即賦值 NULL 或指向合法變量
  2. 使用前檢查: 解引用前務必確認指針非 NULL 且指向有效內存
  3. 區分地址層級: 清楚區分「指針的值」(所指地址)、「指針的地址」(自身地址)、「目標變量的地址」
  4. 嵌入式環境特別注意: Keil 等編譯器對未初始化指針行為不可預測,必須嚴格遵循「先有變量,後有指針」原則
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved