参考资料:
1. 作者 BensonLaur :https://www.cnblogs.com/BensonLaur/p/6367077.html
2. https://blog.csdn.net/yyc1023/article/details/24441319
问题: 二维数组如何转换成指针
问题:cannot convert from 'double [10][10]' to 'double ** '
例如:double arry[5][10] = {0}; double** pp;
pp=arry;
直接的赋值会提示错误:cannot convert from 'double [10][10]' to 'double ** '
解决方法:
double arry[][] = {};
double (*p)[];
for(int i=;i<;i++)
p[i]= arry[i];
注意:char (*p)[5] 不能写为 char *p[5]
分析参考如下(转载):
一个函数形如:
void f(float **p){
/* 想要在函数体中按二维数组的方式访问*/
p[][] = ;//c++用vc编译ok,运行出错(非法访问)
}
float **p; //其实这里的p并不是一个二位数组的指针,只不过是一个指向指针的指针
错误用法例如:
float a[][]={,,,};
float **p=(float**)a;//强制将二维数组指针转为指向指针的指针
则此时
p[]=;
p[]=;
p[]=;
p[]=;
而
p[][]=*(*(p+)+)=**p;
p[][]=*(*(p+)+);
p[0][0] 由于*p=0; ====> **p=*(0); 引用地址为零的内存,必然是错误的。
p[0][1]=*(*p+1)====>*(4), 引用了非法内存
同样,对于p[1][0]=*(1),p[1][1]=*(5),均引用了非法内存
所以说,二位数组并不能简单的转换成指向指针的指针。正确的指向二维数组的指针应该是:
float a[][];
float (*p)[];//只需要定义为指向第二维的指针,忽略第一维
p=a;
p[][]=a[][];
二级指针和二维数组并不等价。二级指针是一个指向指针的指针,而二维数组其实就是一个指针,char a[3][4]; a是指向整个二维数组的首地址。它相当于(char *)[n],并不是char **;
定义:
数组指针: 指向数组的指针,eg:int *p1[10];
指针数组:一个数组,其元素都是指针, eg: int (*p2)[10];
数组指针作为返回类型:
int (* p)[]; /*括号是必须写的,不然就是指针数组;10是数组的大小*/
数组指针作为返回类型:
method 1:
int (*getCopyArr(int (&arr)[]))[]
{
int (*n)[] = (int (*)[])new int[];
for (int i = ; i < ; i++)
(*n)[i] = arr[i];
return n;
}
//note:该函数返回了分配在堆的数组,如果得到该数组后没有释放内存,会导致内存泄漏,这里仅仅作为示例不考虑该问题
method 2:
//使用类型别名(1)
typedef int ArrType[]; ArrType* getCopyArr()
{
return ....;
}
method 3:
//尾置返回类型 (C++11标准)
auto getCopyArr2()->int(*)[]
{
return ....;
}
method 4:
//使用类型别名(2)(C++11 标准)
using ArrType = int[]; AttrType* getCopyArr()
{
return ....;
}