通过一些C面试问题,我找到了一个问题,指出“如何在不使用sizeof运算符的情况下在C中查找数组的大小?”,并提供以下解决方案。它有效,但是我不明白为什么。
#include <stdio.h>
int main() { int a[] = {100, 200, 300, 400, 500}; int size = 0;
size = *(&a + 1) - a;
printf("%d\n", size);
return 0;
} 如预期的那样,它返回5。
编辑:人们指出了这个答案,但是语法确实有所不同,即索引方法
size = (&arr)[1] - arr; 因此,我认为这两个问题都是有效的,并且对该问题的处理方式略有不同。谢谢大家的大力帮助和详尽的解释! 问题来源于stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
这条线是最重要的:
size = *(&a + 1) - a; 如您所见,它首先获取地址a并为其添加一个。然后,它取消引用该指针并a从中减去其原始值。
C语言中的指针算术使它返回数组或中元素的数量5。加1和&a是指向int之后5 秒的下一个数组的指针a。之后,此代码取消对结果指针的引用a,并从中减去(已衰减为指针的数组类型),从而得出数组中的元素数。
有关指针算法工作原理的详细信息:
假设你有一个指针xyz,它指向的int类型和包含的价值(int *)160。当从中减去任何数字时xyz,C表示从中减去的实际数量xyz是该数字乘以它所指向的类型的大小。例如,如果5从中减去xyz,则xyz结果的值将是xyz - (sizeof(*xyz) * 5)指针算术不适用的情况。
由于a是阵列5 int类型,得到的值将是5。然而,这与一个指针,只以与阵列将无法工作。如果您使用指针尝试此操作,结果将始终为1。
这是一个小示例,显示了地址以及地址的不确定性。左侧显示地址:
a + 0 | [a[0]] | &a points to this a + 1 | [a[1]] a + 2 | [a[2]] a + 3 | [a[3]] a + 4 | [a[4]] | end of array a + 5 | [a[5]] | &a+1 points to this; accessing past array when dereferenced 这意味着代码正在a从中减去&a[5](或a+5),得到5。
请注意,这是未定义的行为,在任何情况下都不应使用。不要期望此行为在所有平台上都一致,也不要在生产程序中使用它。