c++ - 为什么值(value)观不同? C++ 指针

标签 c++ arrays pointers

我正在谷歌搜索一个解决方案来找出 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其中第二个printf6 .这是让我感到困惑的部分:因为 &arrarr持有同一个数组的基地址,为什么结果不一样?

最佳答案

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/

相关文章:

c++ - std::thread 的段错误

javascript - 在 JavaScript 中创建二维数组并推送值

java - 如何创建一个查找最后一个匹配项的字符串数组程序?

objective-c - 指针和opengl绘图的问题

c++ - 变量的浅蓝色突出显示

c++ - 相互依赖的静态库

c++ - boost::asio::ip::tcp::socket - 如何绑定(bind)到特定的本地端口

arrays - bash 数组保留包含字符串的元素

c++ - 使用指针迭代数组元素

Cython:将 void* 转换为 double 和反向转换