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

C語言深度解析:為什麼數組名不可修改而元素可修改?

     編輯:程式設計綜合問答

C 語言中字符數組的行為常讓初學者困惑:數組名本身不可修改,但數組元素卻可以逐個修改。這背後涉及數組在內存中的存儲機制和編譯器處理邏輯。

代碼現象

char c[6] = "hello";
c = "s";      // 編譯錯誤:不可修改的左值
c[2] = 's';   // 正常:修改元素成功

核心原理解析

數組名是常量指針

c 是數組首元素地址的常量指針(相當於 char * const c)。編譯時期確定地址,運行時不可改變指向。這類似於 const 常量,一旦初始化就不能重新賦值。

元素存儲在棧上可讀寫

數組 c[6] 在棧上分配了一塊連續的可讀寫內存區域。每個元素佔用 1 字節,通過下標訪問時編譯器計算偏移量(c + i),直接操作該內存地址,因此可自由修改。

對比:字符指針指向字符串常量

char *p = "hello";
p[2] = 's'; // 運行時崩潰:嘗試修改只讀內存區

這裡 p 指向數據段/只讀數據段中的字符串字面量,屬於只讀內存,任何修改嘗試都會導致未定義行為(通常是段錯誤)。

總結

  • 數組名:編譯期確定的常量地址,不可修改指向。
  • 數組元素:棧上可讀寫內存,支持隨機訪問修改。
  • 字符指針初始化字符串:指向只讀區,不可修改內容。

理解這區別對掌握 C 語言內存模型、避免指針相關 Bug 至關重要。

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