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

C語言核心問題匯總:聲明作用、函數與標號、C90混合聲明、static訪問控制、靜態存儲

     編輯:關於C語言

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

C無public/private/protected,靠static+頭文件設計實現封裝。

5. 靜態存儲 vs 動態存儲

  • 靜態存儲區:全局變量、static變量、字符串常量。程序啟動分配,結束釋放,固定地址。
  • 動態存儲區(堆/棧):函數參數、局部非static變量(棧)、malloc內存(堆)。運行時分配/釋放。
  • 關鍵差異:static全局變量雖在靜態區,但鏈接屬性為內部,其他文件extern不可見;普通全局變量為外部鏈接。

💡 面試/考試高頻考點

  1. static三大用法:局部靜態、全局靜態、函數靜態。
  2. C90 vs C99 混合聲明差異。
  3. 字符串常量存儲在只讀數據段,嘗試修改導致未定義行為。
  4. extern僅聲明,不分配內存;定義才分配。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
位置作用
函數外(全局)限制鏈接可见性:僅本文件(編譯單元)可見,防止符號衝突
函數內(局部)改變存儲期:靜態存儲區,生命周期=程序全程,值保持跨調用
函數參數(數組)void f(int a[static 10]) 提示編譯器至少10元素 (C99)