我正在谷歌搜索一个解决方案来找出 C++ 中数组的长度。我找到的解决方案之一是这个
int arr[] = {1,2,3,4,5,6};
int size = *(&arr+1)-arr; //size is the length of the array
我在
&arr
之间感到困惑和 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
持有同一个数组的基地址,为什么结果不一样?
最佳答案
Since both "&arr" and "arr" hold the base address of the same array, why are the results different?
因为类型 是不同的。指针运算受指针类型的影响,更具体地说,受指向对象类型的影响。
&arr
是一个指向 6 个 int 数组的指针。将 1 添加到下一个 6 个整数数组(如果它是数组数组的元素)。arr
, 虽然是一个数组,但在使用它的值时衰减为指向数组第一个元素的指针,例如在指针算术表达式中。衰减值是一个指向 int 的指针,加 1 会将指针移动到下一个整数。附言您可以使用
std::size
反而。或 std::extent
C++ 17 之前的版本。或 sizeof arr / sizeof *arr
C++ 11 之前的版本。*(&arr + 1) - arr
可能有效,但在技术上是通过一个过去的指针(指向一个不存在的对象)间接实现的,这通常是未定义的行为。考虑到该值仅用于衰减到指针,我不确定该规则是否可能存在一些异常(exception)。
关于c++ - 为什么值(value)观不同? C++ 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58108375/