C/C++——数组退化小记
这类型问题比较容易出错而且忘记特此说明总纲一般情况下对于一个数组无论是几维一但直接使用数组名会发生退化比如char(*)[20]退化成char*数组名出现在sizeof或者说数组名前面加了就会阻止退化但是一但在sizeof中的数组名发生了计算就会退化一次一维数组char str[20]表达式类型指向步长说明strchar*首元素1字节退化为指针strchar (*)[20]整个数组20字节数组指针str[0]char第一个元素-元素本身str[0]char*第一个元素1字节等价于strstr 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字节等价于arrarr[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-双重解引用是元素