2026/9/6 4:56:00
网站建设
项目流程
这类型问题比较容易出错而且忘记,特此说明
总纲
- 一般情况下,对于一个数组(无论是几维),一但直接使用数组名,会发生退化(比如char(*)[20]退化成char*)
- 数组名出现在sizeof或者说数组名前面加了&就会阻止退化,但是一但在sizeof中的数组名发生了计算就会退化一次
一维数组:char str[20]
| 表达式 | 类型 | 指向 | 步长 | 说明 |
|---|
str | char* | 首元素 | 1字节 | 退化为指针 |
&str | char (*)[20] | 整个数组 | 20字节 | 数组指针 |
str[0] | char | 第一个元素 | - | 元素本身 |
&str[0] | char* | 第一个元素 | 1字节 | 等价于str |
str + 1 | char* | 第二个元素 | 1字节 | 指针运算 |
&str + 1 | char (*)[20] | 下一个数组 | 20字节 | 跳跃整个数组 |
| 表达式 | sizeof 结果 | 是否退化 | 说明 |
|---|
sizeof(str) | 20 | ❌ 不退化 | 整个数组大小 |
sizeof(&str) | 8 | ✅ 是指针 | 指针大小 |
sizeof(str[0]) | 1 | - | 元素大小 |
sizeof(&str[0]) | 8 | ✅ 是指针 | 指针大小 |
sizeof(str + 1) | 8 | ✅ 退化为指针 | 指针大小 |
sizeof(&str + 1) | 8 | ✅ 是指针 | 指针大小 |
sizeof(*str) | 1 | - | 解引用后是元素 |
sizeof(*(&str)) | 20 | ❌ 不退化 | 解引用整个数组指针 |
二维数组:char arr[2][3]
| 表达式 | 类型 | 指向 | 步长 | 说明 |
|---|
arr | char (*)[3] | 第一行 | 3字节 | 行指针 |
&arr | char (*)[2][3] | 整个数组 | 6字节 | 二维数组指针 |
arr[0] | char* | 第一行首元素 | 1字节 | 退化为指针 |
&arr[0] | char (*)[3] | 第一行 | 3字节 | 等价于arr |
arr[0][0] | char | 第一个元素 | - | 元素本身 |
&arr[0][0] | char* | 第一个元素 | 1字节 | 等价于arr[0] |
arr[1] | char* | 第二行首元素 | 1字节 | 退化为指针 |
&arr[1] | char (*)[3] | 第二行 | 3字节 | 行指针 |
| 表达式 | sizeof 结果 | 是否退化 | 说明 |
|---|
sizeof(arr) | 6 | ❌ 不退化 | 整个二维数组 |
sizeof(&arr) | 8 | ✅ 是指针 | 指针大小 |
sizeof(arr[0]) | 3 | ❌ 不退化 | 第一行数组 |
sizeof(&arr[0]) | 8 | ✅ 是指针 | 指针大小 |
sizeof(arr[0][0]) | 1 | - | 元素大小 |
sizeof(&arr[0][0]) | 8 | ✅ 是指针 | 指针大小 |
sizeof(arr + 1) | 8 | ✅ 退化为指针 | 指针大小 |
sizeof(arr[0] + 1) | 8 | ✅ 退化为指针 | 指针大小 |
sizeof(*arr) | 3 | ❌ 不退化 | 解引用后是第一行 |
sizeof(**arr) | 1 | - | 双重解引用是元素 |