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

C語言字符數組與字符串指針內存佈局圖解

     編輯:關於C語言

一段極簡代碼,揭示字符數組與字符串指針在內存中截然不同的佈局。通過打印地址與值,直觀理解「數組名退化指針」與「指針變量指向只讀區」的本質區別。

測試代碼

#include <stdio.h>
int main() {
    char day[15] = "abcdefghijklmn";  // 字符數組
    char *strTmp = "opqrstuvwxyz";    // 字符串指針

    printf("&day     = %p\n", (void*)&day);
    printf("&day[0]  = %p\n", (void*)&day[0]);
    printf("day      = %p\n", (void*)day);

    printf("\n&strTmp     = %p\n", (void*)&strTmp);
    printf("&strTmp[0]  = %p\n", (void*)&strTmp[0]);
    printf("strTmp      = %p\n", (void*)strTmp);

    getchar();
    return 0;
}

運行結果解讀

1. 字符數組 day

  • 系統分配 15 字節連續內存,標號為 day,內容初始化為字符串
  • &day、&day[0]、day **三者地址值相同** (均為首元素地址)
  • 但類型不同:&day 是 char (*)[15] (數組指針),day 退化為 char*
  • 數組名非變量,不可修改指向 (無法 day++)

2. 字符串指針 strTmp

  • 內存分兩塊:
    ① strTmp 變量自身 (棧上,存地址)
    ② 字符串常量 "opqrstuvwxyz" (只讀數據段)
  • &strTmp:指針變量自身地址
  • &strTmp[0] / strTmp:指向常量首字符地址 (**值相同**)
  • 不可通過 strTmp 修改常量內容 (UB)

指針本質統一認知

指針是**存儲地址的變量**,與 int/double 同屬變量,區別在於:

  • int* 存儲 int 的地址
  • char* 存儲 char 的地址
  • void* 存儲任意類型地址 (通用指針)

理解「指針變量地址」與「指針指向地址」的雙重屬性,是掌握 C 內存模型的關鍵一步。

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