C/C++——数组退化小记
2026/9/6 4:56:00 网站建设 项目流程

这类型问题比较容易出错而且忘记,特此说明

总纲

  • 一般情况下,对于一个数组(无论是几维),一但直接使用数组名,会发生退化(比如char(*)[20]退化成char*)
  • 数组名出现在sizeof或者说数组名前面加了&就会阻止退化但是一但在sizeof中的数组名发生了计算就会退化一次

一维数组:char str[20]

表达式类型指向步长说明
strchar*首元素1字节退化为指针
&strchar (*)[20]整个数组20字节数组指针
str[0]char第一个元素-元素本身
&str[0]char*第一个元素1字节等价于str
str + 1char*第二个元素1字节指针运算
&str + 1char (*)[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]

表达式类型指向步长说明
arrchar (*)[3]第一行3字节行指针
&arrchar (*)[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-双重解引用是元素

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询