gpt4 book ai didi

c++ - 为什么需要将*放在(&a)之前减去(a是一个数组)?

转载 作者:行者123 更新时间:2023-12-01 12:39:15 25 4
gpt4 key购买 nike

我正在学习如何查找数组的长度,而对此解决方案感到困惑。我试图在网上找到解释,但似乎没有。

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

最佳答案

数组的内存地址与第一个元素的内存地址相同,当您在指针上添加或减去指针时,它是通过其指向的类型的大小来完成的,因此:

  • arr表示int,而&arr表示int[5]
  • &arr+1以五个整数的大小递增内存地址。
  • 如果执行(&arr+1)-arr,则会出现编译错误,因为它们是不同的类型。
  • 如果执行(&arr+1)-&arr,则会得到1,因为内存地址的偏移量与int[5]的一种大小相同。
  • 因此,当您执行*(&arr+1)时,将获得相同的内存地址,但指向int而不是int[5] 。现在您将不会遇到编译错误,因为两个指针都指向int,并且您获得的内存地址偏移量是int大小,而不是int[5]
    内存地址和类型有时很难解释,我希望我能说清楚。在这里,您可以运行一些代码来查看其中提到的一些概念:
  •    int arr[5] = {5, 8, 1, 3, 6};
    int len = *(&arr + 1) - arr;

    cout << "arr: " << arr << endl;
    cout << "arr + 1: " << arr+1 << endl;
    cout << "&arr: " << &arr << endl;
    cout << "&arr + 1: " << &arr+1 << endl;
    cout << "*(&arr + 1): " << *(&arr+1) << endl;

    // cout << "&arr + 1 - arr: " << &arr+1-arr << endl;
    // error: invalid operands of types ‘int (*)[5]’ and ‘int [5]’ to binary ‘operator-’

    cout << "The length of the array is: " << len;

    关于c++ - 为什么需要将*放在(&a)之前减去(a是一个数组)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63442909/

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