【发布时间】:2019-09-26 01:26:16
【问题描述】:
我在谷歌上搜索了一个解决方案来找出 C++ 中数组的长度。我找到的解决方案之一是这个
int arr[] = {1,2,3,4,5,6};
int size = *(&arr+1)-arr; //size is the length of the array
我对@987654323@ 和arr 感到困惑,因为两者都给出了数组的基地址。再次谷歌,发现&arr + 1 给出了不属于数组的下一个内存块的地址,而arr + 1 给出了数组中下一个元素的地址。
我写了以下代码来测试&arr和arr之间的区别:
int arr[] = {1,2,3,4,5,6};
printf("value of &arr + 1 - &arr = %d\n", &arr + 1 - &arr);
printf("value of *(&arr + 1) - arr = %d\n", *(&arr + 1) - arr);
第一个printf 的答案是1,而第二个printf 的答案是6。这是让我困惑的部分:既然&arr 和arr 都持有同一个数组的基地址,为什么结果不同?
【问题讨论】:
-
&arr + 1 - &arr = &arr - &arr + 1 = 1。
-
@solarflare -- 不是这样,
*(&arr + 1) - arr == 6。为什么?&arr是 指向 char [6] 数组的指针,因此&arr + 1是 指针(指向紧随其后的地址)char [6] 数组。当你取消引用 pointer to array 时,你会得到一个 array,它通过在访问时转换为指针是int(在这种情况下)的地址在arr之后。所以*(&arr + 1) - arr将给出int数组中的元素数,就像sizeof arr / sizeof *arr一样。 -
注意:这里更有用的可能是打印出您正在工作的对象的地址(在
&arr +1的情况下为非对象),以查看它们在内存中的布局位置将是printf中的%p格式选项。 -
你忘记了类型系统。指针上的
+1表示指向指针所指向的下一个事物。这并不意味着 +1 字节。