C語言核心概念澄析:五大易混淆知識點深度解讀
1. 聲明決定實體屬性:變量 vs 函數 vs 數組
C語言中,標識符的聲明賦予其完整語義:
int func(void); → func是函數,代表代碼入口地址。
int a[2]; → a是數組首地址,類型int*。
int *p; → p是指針變量,存儲地址。
- 後續所有
func/a/p的使用,均由聲明時確定的屬性決定。
2. 函數 vs 標號:同為代碼地址,能力不同
- 函數:有參數列表、有返回值、有調用約定、可遞歸、獨立作用域。
- 標號:僅是
goto目標地址,無參數、無返回、無作用域隔離,本質是JMP指令標記。
3. Linux/GCC編譯警告:ISO C90 forbids mixed declarations and code
原因:C89/C90標準要求塊內所有聲明必須在語句之前。
// 錯誤示例 (C90)
void f() { printf("hi"); int i; } // 警告
// 正確寫法 (C90/C99均兼容)
void f() { int i; printf("hi"); }
解決**:調整代碼順序,或編譯時指定-std=c99或-std=c11 (現代標準允許混合)。
4. C語言唯一的訪問控制符:static
| 位置 | 作用 |
| 函數外(全局) | 限制鏈接可见性:僅本文件(編譯單元)可見,防止符號衝突 |
| 函數內(局部) | 改變存儲期:靜態存儲區,生命周期=程序全程,值保持跨調用 |
| 函數參數(數組) | void f(int a[static 10]) 提示編譯器至少10元素 (C99) |
C無public/private/protected,靠static+頭文件設計實現封裝。
5. 靜態存儲 vs 動態存儲
- 靜態存儲區:全局變量、
static變量、字符串常量。程序啟動分配,結束釋放,固定地址。
- 動態存儲區(堆/棧):函數參數、局部非static變量(棧)、
malloc內存(堆)。運行時分配/釋放。
- 關鍵差異:
static全局變量雖在靜態區,但鏈接屬性為內部,其他文件extern不可見;普通全局變量為外部鏈接。
💡 面試/考試高頻考點
static三大用法:局部靜態、全局靜態、函數靜態。
- C90 vs C99 混合聲明差異。
- 字符串常量存儲在只讀數據段,嘗試修改導致未定義行為。
extern僅聲明,不分配內存;定義才分配。
- 上一篇文章: YL-236開發板:AT89S52單片機驅動LED點陣顯示漢字(C語言)
- 下一篇文章: YL-236開發板:LCD12864顯示漢字C語言驅動程序
Copyright ©
程式碼之家 All Rights Reserved