您好,欢迎来到99网。
搜索
您的当前位置:首页C++笔记-数组指针二维数组转换指针

C++笔记-数组指针二维数组转换指针

来源:99网
C++笔记-数组指针⼆维数组转换指针

参考资料:

问题: ⼆维数组如何转换成指针

问题: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 ....;}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 99spj.com 版权所有 湘ICP备2022005869号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务