gpt4 book ai didi

c++ - *(&arr + 1) - arr 如何给出数组 arr 元素的长度?

转载 作者:行者123 更新时间:2023-12-01 14:04:36 26 4
gpt4 key购买 nike

#include <iostream>
using namespace std;

int main() {
int arr[5] = {5, 8, 1, 3, 6};
int len = *(&arr + 1) - arr;
cout << "The length of the array is: " << len;
return 0;
}

对于上面的代码,我不太明白这两段代码是做什么的:
*(&arr + 1) 


*(&arr)
&arr

有人可以解释一下吗?因为当我运行以下两个代码时,我得到以下相同的输出:
&arr (我认为这指向arr的第一个元素的地址)
*(&arr)然后我不太明白这是做什么的,符号 *是什么意思做 &arr (即到这里的地址)?,因为当我运行它们时,两个输出是相同的

最后,当一个整数说 1 被这里的代码添加到地址时,到底发生了什么: &arr + 1

最佳答案

这是一个雷区,但我会试一试:

  • &arr返回指向 int[5] 的指针
  • + 1步进指针一 int[5]
  • *(&arr + 1)将结果解引用回 int(&)[5]我不知道这是否会导致未定义的行为,但如果没有,下一步将是:
  • *(&arr + 1) - arr在两个 int[5] 之后进行指针运算已经衰减到 int指针,返回两者之间的差异 int指针,即 5 .

  • 重写以使其更清晰:
    int  arr[5] = {5, 8, 1, 3, 6};

    int (*begin_ptr)[5] = &arr + 0; // begin_ptr is a int(*)[5]
    int (*end_ptr)[5] = &arr + 1; // end_ptr is a int(*)[5]

    // Note:
    // begin_ptr + 1 == end_ptr
    // end_ptr - begin_ptr == 1

    int (&begin_ref)[5] = *begin_ptr; // begin_ref is a int(&)[5]
    int (&end_ref)[5] = *end_ptr; // end_ref is a int(&)[5] UB here?

    auto len = end_ref - begin_ref; // the array references decay into int*
    std::cout << "The length of the array is: " << len << '\n'; // 5
    我会留下这个问题,它是 UB 还是未打开,但在分配引用的存储之前引用一个对象看起来有点可疑。

    关于c++ - *(&arr + 1) - arr 如何给出数组 arr 元素的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61237796/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com