公司动态
自学C语言的第13天 教你如何区分指针数组和二维字符型数组
区分指针数组和二维字符数组核心抓住一句话指针数组是 “装指针的数组”二维字符型数组是 “真正连续的二维字符空间”。1二维字符型数组char arr [3][10] {“aaa”, “bbb”, “ccc”};是真正的二维数组内存连续整块分配每行长度固定这里每行 10 字节2字符指针数组char *parr[3] {“aaa”, “bbb”, “ccc”};是数组里存了 3 个 char* 指针每个指针指向一段字符串可能分散在内存各处每行长度可以不一样2. 内存布局本质区别二维字符数组 arr [3] [10]一块连续内存总大小 行数 × 列数这里总大小 3×10 30 字节每行都占 10 字节不够的补 ‘\0’*指针数组 charparr[3]数组本身只存3 个指针64 位下每个指针 8 字节 → 数组大小24 字节字符串 “aaa”、“bbb” 等不连续散落在常量区3. 用 sizeof 直接判断最实用char arr[3][10];sizeof(arr) → 30真正二维数组char *parr[3];sizeof(parr) → 24指针数组只算指针大小**4. 访问形式看起来一样但本质不同**两者都可以这样用arr [1] [2];parr [1] [2];但底层逻辑完全不同arr [1] [2]地址偏移计算直接定位parr [1] [2]先取指针 parr[1]再偏移 2 字节5. 能否修改字符串内容二维字符数组char arr [3] [10] {“aaa”};arr [0] [0] ‘A’; ✅ 可以修改数组本身存字符可写。指针数组指向字符串常量char *parr[3] {“aaa”};parr[0][0] ‘A’; ❌ 未定义行为通常崩溃指针指向只读常量字符串不能改内容。