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

时间:2021-08-12 02:00:08

参考资料:

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 ....;
}

C++笔记-数组指针/二维数组转换指针的更多相关文章

  1. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 &vert; IT宅&period;com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  2. C语言指针系列 - 一级指针&period;一维数组&comma;二级指针&comma;二维数组&comma;指针数组&comma;数组指针&comma;函数指针&comma;指针函数

    1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...

  3. JAVA描述算法和数据结构&lpar;01&rpar;:稀疏数组和二维数组转换

    本文源码:GitHub·点这里 || GitEE·点这里 一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反, ...

  4. c&plus;&plus;指针数组与二维数组的最大区别

    下面随笔是关于指针数组说明及与二维数组的最大区别. 指针数组 数组的元素是指针型 例 利用指针数组存放矩阵 1 #include 2 using namespace std; 3 int main() ...

  5. c&num;简单实现二维数组和二维数组列表List&amp&semi;lt&semi;&amp&semi;gt&semi;的转置

    刚看到网上一篇文章里用sql实现了行列转置.sql server 2005/2008只用一个pivot函数就可以实现sql server 2000很多行的复杂实现.提到转置,立刻想起还在求学阶段曾经做 ...

  6. 二维数组,锯齿数组和集合 C&num; 一维数组、二维数组(矩形数组)、交错数组(锯齿数组)的使用 C&num; 数组、多维数组(矩形数组)、锯齿数组(交叉数组)

    二维数组,锯齿数组和集合 一.二维数组 二维数组:一维数组----豆角二维数组----表格 定义:1.一维数组:数据类型[] 数组变量名 = new 数据类型[数组长度];数据类型[] 数组变量名 = ...

  7. 第二篇 javascript一维数组和二维数组及方法

    一.数组 什么是数组 程序=数据+算法 数组就是一种很常见的保存批量数据的数据结构 一.定义数组 var arr1=[]; //定义了一个不包含元素的数组 ,,]; //定义了一个包含三个元素的数组 ...

  8. C&num;的一维数组和二维数组定义方式:

    一维数组: //一维数组定义与初始化 ,, };//第一种方式 , , }; //第二种方式 int[] one3; //第三种方式 one3=,,}; 二维数组: //二维数组定义与初始化 //不规 ...

  9. C&num; 数组、一维数组、二维数组、多维数组、锯齿数组

    C#  数组.一维数组.二维数组.多维数组.锯齿数组 一.数组: 如果需要使用同一类型的对象,就可以使用数组,数组是一种数据结构,它可以包含同一类型的多个元素.它的长度是固定的,如长度未知的情况下,请 ...

  10. java - day005 - 数组工具类&comma; 数组复制&comma;二维数组&comma;变量&comma;方法&comma; 面向对象

    1. java.util.Arrays  数组工具类    Arrays.toString (数组) 数组值链接字符串 Arrays.sort(数组) 基本类型: 优化的快速排序 引用类型: 优化的合 ...

随机推荐

  1. IIS 7&period;5 应用程序池预热模块组件

    预热组件下载地址:下载地址 IIS预热模块配置界面插件:下载地址 Warm Up设定方式: (1) 应用程序池层级:只要有需要的应用程序池的Start Mode设定AlwaysRunning就可以 ( ...

  2. JAVA属性和成员的可见性

  3. nginx-upstream-keepalive&semi;accept&lowbar;mutex-proxy&lowbar;http&lowbar;version-1&period;1-proxy&lowbar;set&lowbar;header-connection

    nginx+resin+redis+mysql的架构: 有外部模拟用户请求的大量攻击:它尝试请求了80就断开:看到的现象是在跑有nginx80的主机上TCP连接数少 : ESTABLISHED少: 在 ...

  4. java Cache框架

    Cache框架乱炖   各类开源的缓存解决方案 JBossCache/TreeCacheJBossCache是一个复制的事务处理缓存,它允许你缓存企业级应用数据来更好的改善性能.缓存数据被自动复制,让 ...

  5. 论JavaScript的作用域

    一直以来本人认为想深入了解一门语言,不光是让自己变成撸sir,更需要时间的锤炼.能经得起时间考验的东西更值得拥有.学习和使用Javascript一晃都7年了,最近才感觉自己对他才有顿悟,不知道是否来得 ...

  6. 使用import scope解决maven继承(单)问题&lt&semi;转&gt&semi;

    测试环境 maven 3.3.9 想必大家在做SpringBoot应用的时候,都会有如下代码: <parent> <groupId>org.springframework.bo ...

  7. BCH&sol;BSV coin split troubleshooting

    BCH/BSV coin split troubleshootingMark Lundeberg 2018 November 27ResourcesGuides:Locktime based spli ...

  8. iphone清除数字链接

    <meta name="format-detection" content="telephone=no">

  9. webservice系统学习笔记3-分析wsdl文件的组成

    详细分析前面章节的服务的wsdl文件 1.http://localhost:8888/ws01?wsdl 2.http://localhost:8888/ws01?xsd=1 在接口服务中添加复杂类型 ...

  10. Centos为mysql开启binlog

    1.查询mysql配置文件所在位置 2.编辑配置文件/etc/my.cnf 在文件尾部添加: log-bin=/var/lib/mysql/mysql-bin server-id=123454  (5 ...