在Find size of array without using sizeof中,数组的大小通过以下方式计算
int arr[100];
printf ("%td", (&arr)[1] - arr);
现在,为了指针算术的目的,arr
被认为是单元素数组的元素,所以
&arr + 1
是该(概念)单元素数组末尾的指针,因此当arr[0]
减去的地址时,arr
就获得了元素的数量。
在(&arr)[1]
中,该指针是间接运算符的操作数,
(&arr)[1] ≡ *(&arr + 1)
int*
然后根据 6.3.2.1 (3)将生成的数组表达式转换为一个。
到目前为止,一切都很好。但是 6.5.6 (8) 中的最后一句(加法运算符),
如果结果指向数组对象的最后一个元素,则不应将其用作计算的一元运算符的操作数
*
。
禁止评估那里的间接运算符。
问题是间接运算符是否在
*(&arr + 1) - arr
(在这种情况下,该表达式将调用未定义的行为)或数组到指针的转换会取消评估(在这种情况下一切都很好),就像获取地址 ( &(*(&arr + 1))
) 或应用sizeof
到它会..