int (*get_arr(int i))[5]{ //第一个*
int a[5]={0,1,2,3,4};
return &a; //第一个&
}
std::cout<< *( *get_arr(0) + 1 ) <<std::endl; //从左向右: 第二个* 第三个*
请问各位,函数执行完以后,a[5]不应该被销毁了吗?
我理解的是, a[5]这个数组, 第一个&取了a[0]-a[4]所在的地址放在那个返回的[5]里.
然后第一个*代表的是解引用还是指针呢?,
第三个*是从get_arr返回的[5]里面取地址变成指针,然后对指针+1操作
然后用第二个*对+1后的指针解引用.
但是a[5]为什么没有被销毁呢?
看了看网上普遍的答案, 是因为a[5]在堆里吗?
注:
C++ primer原话(小的不才,读不懂,各位能否解释一下?):
func(int i)表示调用func函数是需要一个int类型的实参 √
(*func(int i))意味着我们可以对函数调用的结果执行解引用操作 ×
(*func(int i))[10]表示解引用func的调用将得到一个大小是10的数组 ×
int (*func(int i))[10]表示数组中的元素是int类型 × 数组中的元素不应该是指针吗???
是的
取数组的地址,得到并返回了数组的指针
这个是类型定义,不是运算符。所以应该是指针吧
函数返回的是
int(*)[5]
一个指向数组的指针。*
解引用,得到一个数组int[5]
数组自动转换为指向第一个元素的指针
int*
最后对这个指针 +1
已经销毁了。
对已经销毁的指针解引用是一个未定义行为。
未定义行为任何事情都可能发生。