< 解决二维数组最好的方法就是把它当作一个一维数组 --鲁迅 >
我们都知道,数组不能做函数的返回值,在看到这里之前都试过把数组当返回值罢(悲
我们常用的返回一维数组的方法::用 数组的首地址 代替数组作为返回值:
int* function(int arr[2]) { return arr; }
改写一下:
auto function(int arr[2]) -> int(*) { //当然写 int* 写可以 return arr; }
【错误的】试着用这种方法套在二维数组上:
int** function(int arr[2][2]) { return arr; //error }
用到了二重指针,可见这种方法很糟糕!返回值如何选择都是错误的,因为无法返回二重指针。
【正确的】那我们用指针数组 int* array[10] 来解决这个问题
auto function(int arr[2][2]) -> int(*)[2]{ //这里就不可以写成 int*[2] 了 return arr; }
【剖 pou 析】
这里表面上用的是 指针数组,返回值类型 看起来像数组。非也::看图:
这个int(*)[2]内部是这样的,也就是:它的首地址和子元素 [ 0 ] 的首地址一模一样, 意味着你返回一个它和返回一个一维数组没有本质上的区别
int(*)[2] 和 int(*) 本质都是一样的,前者不过是两个不同的后者拼起来的罢了,所以 return arr 都能解决
typedef int (*Arrrr)[2]; // 丑陋 using Arrr = int(*)[2]; // 优雅 Arrr function(int arr[2][2]) { return arr; }