參考資料:
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[5][10] = {0};
double (*p)[5]; for(int i=0;i<5;i++) p[i]= arry[i];
注意:char (*p)[5] 不能寫為 char *p[5]
分析參考如下(轉載):
一個函數形如:
void f(float **p){ /* 想要在函數體中按二維數組的方式訪問*/ p[1][1] = 0;//c++用vc編譯ok,運行出錯(非法訪問) }
float **p; //其實這里的p並不是一個二位數組的指針,只不過是一個指向指針的指針
錯誤用法例如:
float a[2][2]={0,1,2,3}; float **p=(float**)a;//強制將二維數組指針轉為指向指針的指針
則此時
p[0]=0; p[1]=1; p[2]=2; p[3]=3;
而
p[0][0]=*(*(p+0)+0)=**p; p[0][1]=*(*(p+0)+1);
p[0][0] 由於*p=0; ====> **p=*(0); 引用地址為零的內存,必然是錯誤的。
p[0][1]=*(*p+1)====>*(4), 引用了非法內存
同樣,對於p[1][0]=*(1),p[1][1]=*(5),均引用了非法內存
所以說,二位數組並不能簡單的轉換成指向指針的指針。正確的指向二維數組的指針應該是:
float a[5][10]; float (*p)[10];//只需要定義為指向第二維的指針,忽略第一維 p=a; p[0][1]=a[0][1];
二級指針和二維數組並不等價。二級指針是一個指向指針的指針,而二維數組其實就是一個指針,char a[3][4]; a是指向整個二維數組的首地址。它相當於(char *)[n],並不是char **;
定義:
數組指針: 指向數組的指針,eg:int *p1[10];
指針數組:一個數組,其元素都是指針, eg: int (*p2)[10];
數組指針作為返回類型:
int (* p)[10]; /*括號是必須寫的,不然就是指針數組;10是數組的大小*/
數組指針作為返回類型:
method 1:
int (*getCopyArr(int (&arr)[10]))[10] { int (*n)[10] = (int (*)[10])new int[10]; for (int i = 0; i < 10; i++) (*n)[i] = arr[i]; return n; } //note:該函數返回了分配在堆的數組,如果得到該數組后沒有釋放內存,會導致內存泄漏,這里僅僅作為示例不考慮該問題
method 2:
//使用類型別名(1) typedef int ArrType[10]; ArrType* getCopyArr() { return ....; }
method 3:
//尾置返回類型 (C++11標准) auto getCopyArr2()->int(*)[10] { return ....; }
method 4:
//使用類型別名(2)(C++11 標准) using ArrType = int[10]; AttrType* getCopyArr() { return ....; }