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

day
day,內容初始化為字符串&day、&day[0]、day **三者地址值相同** (均為首元素地址)&day 是 char (*)[15] (數組指針),day 退化為 char*day++)strTmp
strTmp 變量自身 (棧上,存地址)"opqrstuvwxyz" (只讀數據段)&strTmp:指針變量自身地址&strTmp[0] / strTmp:指向常量首字符地址 (**值相同**)指針是**存儲地址的變量**,與 int/double 同屬變量,區別在於:
int* 存儲 int 的地址char* 存儲 char 的地址void* 存儲任意類型地址 (通用指針)理解「指針變量地址」與「指針指向地址」的雙重屬性,是掌握 C 內存模型的關鍵一步。