首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言函數參數:為何慣用 char *p 而非 char p[]?

     編輯:程式設計綜合問答

現象

項目中大量見 void fun(const char *p),鮮見 void fun(const char p[])。

本質區別

特性char *pchar p[]
參數傳遞傳遞指針值(4/8 字節)語法糖,編譯器同樣退化為指針
函數內 sizeofsizeof(p) = 指針大小sizeof(p) = 指針大小(非數組長度)
可修改指向p = other_ptr; 合法p = other_ptr; 編譯錯誤(數組名不可修改)
語義表達明確表示「指向字符串/緩衝區的指針」誤導以為「傳遞整個數組副本」

為何工程慣用 *p

  1. 無歧義:見到 char *p 立即知道是指針操作,不會誤以為傳值。
  2. 靈活:函數內可移動指針(p++)、重新賦值,配合 const 保護數據。
  3. 歷史習慣:K&R C 時代數組參數自動退化,標準庫(strcpy、printf)均用指針形式,形成事實標準。
  4. 棧開銷極小:無論哪種寫法,實參只壓入一個地址值,無性能差異。

何時用 p[]

  • 強調「這是一個數組」的語義,且函數內不修改指針本身,僅做下標訪問。
  • 配合靜態分析工具(如 MISRA C)要求顯式數組邊界:void fun(char p[10])。

最佳實踐建議

// 只讀字符串
void print_str(const char *str);

// 修改緩衝區內容,不改指針
void fill_buf(char *buf, size_t len, char ch);

// 需要返回新分配的內存
char* allocate_str(size_t len);

統一使用 指針 + const 正確性,文檔中說明緩衝區長度約定,比裝飾性的 [] 更工程化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved