为什么值不同?C++指针

Why are the values different? C++ pointer

本文关键字:C++ 指针 为什么      更新时间:2023-10-16

我正在谷歌搜索一个解决方案,以找出C++数组的长度。我找到的解决方案之一是这个

int arr[] = {1,2,3,4,5,6};
int size = *(&arr+1)-arr; //size is the length of the array

我在&arrarr之间感到困惑,因为两者都给出了数组的基址。再次谷歌搜索,发现&arr + 1给出了不属于数组的下一个内存块的地址,arr + 1给出了数组中下一个元素的地址。

我编写了以下代码来测试&arrarr之间的区别:

int arr[] = {1,2,3,4,5,6};
printf("value of &arr + 1 - &arr = %dn", &arr + 1 - &arr);
printf("value of *(&arr + 1) - arr = %dn", *(&arr + 1) - arr);

第一个printf的答案是1第二个printf给出6。这是让我感到困惑的部分:既然&arrarr都保存同一数组的基址,为什么结果不同?

既然"&arr"和"arr"都保存同一数组的基址,为什么结果不同?

因为类型不同。指针算术受指针类型的影响,更具体地说,受指向对象的类型的影响。

&arr是指向 6 int 数组的指针。将 1 添加到该数组中将递增到下一个 6 int 数组(如果它是数组数组的元素(。

arr虽然是一个数组,但在使用数组的值时(例如在指针算术表达式中(衰减为指向数组第一个元素的指针。衰减的值是指向 int 的指针,将 1 加法会将指针移动到下一个整数。

附言您可以改用std::size。或者std::extentC++ 17 之前。或者sizeof arr / sizeof *arrC++11 之前。

*(&arr + 1) - arr可能有效,但从技术上讲,通过过去结束的指针(指向不存在的对象(间接,这通常是未定义的行为。我不确定考虑到该值仅用于衰减到指针,该规则是否可能存在一些例外。

&arr 和 arr 是不同的指针。 arr 是数组 "arr" 的第一个元素的地址。 但是 &arr 是指针 arr 的地址。在 &arr 地址中有数组"arr"的地址。 所以它是数组地址的地址。 因此,&arr 是不可预料的,而 *(&arr + 1( 也是不可预料的。 因为我们不知道哪个值保存在 &arr 的下一个地址中。

让我解释一下你的两个printf声明。 &arr + 1 - &arr 始终返回 1。因为它在 &arr 中添加 1 并再次减去 &arr,所以结果是 1。 *(&arr + 1( - arr 返回意外的结果。因为 *(&arr + 1( 是不可预料的,而 arr 也是不可预料的,所以结果是不可预料的。

这就是为什么这两个结果是不同的。

很抱歉不是用户友好的答案。 谢谢,最好的问候。

金毅.