參考資料:html
1. 做者 BensonLaur :http://www.javashuo.com/article/p-oqbqcmis-cs.htmlc++
2. https://blog.csdn.net/yyc1023/article/details/24441319數組
問題: 二維數組如何轉換成指針函數
問題:cannot convert from 'double [10][10]' to 'double ** '
例如:double arry[5][10] = {0}; double** pp;spa
pp=arry;.net
直接的賦值會提示錯誤:cannot convert from 'double [10][10]' to 'double ** '指針
解決方法:code
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]htm
分析參考以下(轉載):blog
一個函數形如:
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 ....; }