【发布时间】: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;
我的意思是在这段代码中 &a 和 &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<int *>(ar)}; *(tmp_p_ar_items);而ar[0]实际上等同于以下内容:int * tmp_p_ar_items{static_cast<int *>(ar)}; *(tmp_p_ar_items + 0);。您可以通过比较sizeof(ar)和sizeof(int *)或使用std::is_same来检查数组不是指针
标签: c++ arrays pointers memory-address stack-memory