C++筆記-數組指針/二維數組轉換指針

參考資料: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]={0123};
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 ....;
}
相關文章
相關標籤/搜索