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

C 語言陣列與指標差異深度解析:定義、宣告與記憶體模型

     編輯:關於C語言

核心觀念:陣列 ≠ 指標

「陣列與指標相同」是危險的錯誤認知。ANSI C 標準規定:

// 檔案 1:定義
char mango[] = "abc";

// 檔案 2:外部宣告 —— 錯誤!
extern char *mango; // 應為 extern char mango[];

編譯器會報錯,因為「陣列定義」與「指標外部宣告」不匹配。

定義 vs 宣告

  • 定義:建立物件、配置記憶體,全程式僅能出現一次。
  • 宣告:描述其他處定義的物件,可重複出現(通常加 extern)。

左值與右值、直接/間接引用

  • 賦值 X = Y 中,X 為左值(位址,編譯期可知),Y 為右值(內容,執行期可知)。
  • 陣列 a[i]:編譯器直接以陣列基址 + 偏移量存取 —— 直接引用。
  • 指標 p[i]:需先取得 p 儲存的位址,再加偏移 —— 間接引用。

編譯錯誤示意 陣列記憶體佈局 指標記憶體佈局

字串常數初始化差異

  • char *p = "abc";:指標指向唯讀區域,嘗試修改行為未定義。
  • char a[] = "abc";:陣列在堆疊/資料區,內容可修改。

結論

陣列位址固定、不可重新指向;指標可指向不同位址。務必讓宣告與定義完全匹配,避免未定義行為。

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