【问题标题】:C++ How pointer's memory address and pointed array's memory address can be same? [duplicate]C ++指针的内存地址和指向数组的内存地址如何相同? [复制]
【发布时间】:2019-04-07 09:20:21
【问题描述】:

在此代码中ar&ar 相同。但是ar不只是一个指向ar[0]的常量指针吗?那么我想写cout<<ar;应该给ar[0]的内存地址,而写cout<<&ar;应该给它自己的内存地址,所以它们应该是不同的。他们怎么一样?有人说ar 不是一个指针,如果cout<<*ar 不是指向ar[0] 的指针,它如何等于ar[0] 的值?

int ar[3] = {1,2,3};
cout<<ar<<endl;
cout<<&ar<<endl;

我的意思是在这段代码中 &amp;a&amp;b 是不同的,这是有道理的。

   int a = 5;
    int* b = &a;
    cout<<&a<<endl;
    cout<<&b<<endl;

【问题讨论】:

  • 不,arr 不是指针,它是array of 3 ints。不过,它可以隐式转换为pointer to int
  • 是的,@VTT 是对的,arr 是一个数组。尽管它确实包含第一个元素的地址,但不能将其视为指针。我认为每当我们使用它来代替指针时,它都会简单地衰减为一个指针。
  • 如果 *ar 不是指向 ar[0] 的指针,它如何等于 ar[0] 的值
  • 这是一个很好的问题。数组或指针这不是那么重要。为什么它自己的地址就等于它的值???
  • *ar 实际上等同于以下内容:int * tmp_p_ar_items{static_cast&lt;int *&gt;(ar)}; *(tmp_p_ar_items);ar[0] 实际上等同于以下内容:int * tmp_p_ar_items{static_cast&lt;int *&gt;(ar)}; *(tmp_p_ar_items + 0);。您可以通过比较 sizeof(ar)sizeof(int *) 或使用 std::is_same 来检查数组不是指针

标签: c++ arrays pointers memory-address stack-memory


【解决方案1】:
int ar[3] = {1,2,3};

ar 这是一个“数组指示符”,自动转换指向第一个数组元素的指针。 ar 等价于 &amp;a[0]。所以ar 有一个类型int *

&amp;ar 是一个指向整个数组的指针,类型为int (*)[3]

以下代码有效(指针兼容)

int *par0 = ar;
int (*par)[3] = &ar;

虽然a&amp;a 的类型不同,但它们的值相同——第一个数组元素的地址和整个数组的地址是相同的。

【讨论】:

  • ar 的类型为 int[3]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
相关资源
最近更新 更多