【问题标题】:Pointer Arithmetic Question (size of array) [C++] [duplicate]指针算术问题(数组大小)[C++] [重复]
【发布时间】:2020-04-30 02:39:11
【问题描述】:
#include <bits/stdc++.h> 
using namespace std; 

int main() 
{ 
    int  arr[] = {1, 2, 3, 4, 5, 6}; 
    int size = *(&arr + 1) - arr; 

    return 0; 
} 

int size = *(&amp;arr + 1) - arr; 如何准确找到数组的大小?我已经阅读了 geeksforgeeks 的解释,但仍然有点困惑。我想如果你取消引用 (&arr + 1) 那么它会给你一个不存在的值,因为你跳过了 6 个整数,这在那个内存地址中可能是随机的?而且,如果您能够取消引用 (&arr + 1) 到 int 类型,那么您如何能够从 arr 中减去该值?

【问题讨论】:

标签: c++ arrays pointers pointer-arithmetic


【解决方案1】:

*(&amp;arr + 1) - arr 是一种相当复杂的写法6。

&amp;arr 是指向int[6] 的指针

(&amp;arr + 1) 是一个指向 int[6] 的指针,它在 arr 之后开始,即它在内存中高出 6 个 ints。

*(&amp;arr + 1) 是arr 之后的那个假想数组。那里没有数组,但我们不会使用它,所以没关系。

在*(&amp;arr + 1) - arr 中,两个整数数组在应用差分运算之前被转换为int * 指向它们的第一个元素的指针。由于这些数组在内存中相隔 6 个ints,因此这两个指针之间有 6 个ints,结果为 6。

【讨论】:

  • 一开始我也是这么想的,但应该是定义行为!
  • "那里没有数组,但我们不会使用它,所以没关系。" - 代码在技术上仍然是未定义的行为,因为 * 运算符的语义仅在指针指向有效对象的情况下定义,使得行为因省略而未定义。有一个关于该主题的公开 CWG 问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多