先来回顾一下通常动态二维数组的创建过程,这里以 m×n int数组为例

 int **pp=new int*[m];for(int i=0;i<m;++i)*(pp+i)=new int[n];//通过*(*(pp+i)+j)操作数组元素(i,j)for(i=0;i<m;++i)delete [] *(pp+i);delete [] pp;

这样的方式称为离散动态数组,主要存在两个缺点:

1. 数组储存区不连续;

2. 堆上空间释放比较麻烦。

图中以m=4,n=3为例。

所以我们寻求更好的代码:

  int *p=new int[m*n];int **pp=new int*[m];for(int i=0;i<m;++i)*(pp+i)=p+i*n;delete [] pp;delete [] p;

同样通过 *(*(pp+i)+j) 访问数组成员(i,j),先申请一段连续的空间,然后让指针数组保存它们的地址。

图中,m=4,n=3,这样做有两个好处:

1. 空间的释放更方便了;

2. 可以重新操作这段空间组成新数组。相较于第一种方式,其额外的开销仅是一个int*变量。

比如要把m×n个int所组成的空间段重分配为k×j的数组:

   delete [] pp;pp=new int*[k];for(int i=0;i<k;++i)*(pp+i)=p+i*j;

图中,以k=2,j=6为例。

通过观察代码,不难发现对于任意的i,都有

     *(pp+i)=p+i*n;

那么此时对于二维数组的操作事实上不需要二级指针的参与,只需一句表达式即可以用元素(i,j):

   int *p=new int[m*n];//*(p+i*n+j)——(i,j)delete [] p;

其实矩阵这个概念本来就是抽象的,把一个串拆分下并列着放就是矩阵了。对于这样的存储方式,可以很轻松的完成其转置,只要换一种引用方式:

*(p+i+j*n)

即可完成矩阵的“转置”操作。事实上根本没有矩阵,存在的只是在内存中的一块连续空间而已,不同的访问方式显示了这块内存段在我们大脑中不同的映射。

这里并不是按常规的思维方式,先形成一个二维数组,如A(m,n),然后填充,而是创建一个串,按某种规则写入数据,按某种规则读取数据。对于普通的矩阵操作,其读写规则为同一种。

而对于一个矩阵转置问题,其本质是,按某种规则写入数据,按另一种规则读取数据,而这两种规则的不同点反映出矩阵转置的概念。内存段没变,变的是它在我们大脑中映射的矩阵,或者更准确的说是映射的规则变了。

转载于:https://www.cnblogs.com/silyvin/archive/2012/02/03/9106915.html

再议动态二维数组,通过一句表达式完成矩阵的转置相关推荐

  1. C++建立动态二维数组

    C++建立动态二维数组主要有两种方法: 1.使用数组指针,分配一个指针数组,将其首地址保存在b中,然后再为指针数组的每个元素分配一个数组            int **b=new int*[row ...

  2. C++——C++创建动态二维数组+memset()函数初始化

    C++开辟动态二维数组的几种方法总结 原文链接:https://blog.csdn.net/xiang_shao344/article/details/99684395 一.用 new 来动态开辟一个 ...

  3. C++动态二维数组演示的代码

    将代码过程中经常用到的代码珍藏起来,下边资料是关于C++动态二维数组演示的代码. #include <iostream> #include <string>using name ...

  4. 动态二维数组赋值及for循环遍历和toString遍历

    package com.Summer_0421.cn;import java.util.Arrays;/*** @author Summer* 动态二维数组赋值及for循环遍历和toString遍历* ...

  5. C语言实现动态二维数组及相乘

    一.二维数组的概念  1.二维数组本质上是以数组作为数组元素的数组,即数组的数组. 2.二维数组就是一个有行和列的矩阵,每一行代表一个数组,即数组的数组. 3.每一行数组内元素所在的位置可以用行和列号 ...

  6. C++之定义动态二维数组

    C++之定义动态二维数组 直接上代码 #include"stdio.h" #include<iostream> using namespace std; int mai ...

  7. java创建动态二维数组

    java创建动态二维数组 //声明Scanner对象,获取键盘输入值Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = s ...

  8. 二维动态数组空间分配 c语言,科学网—C语言中动态二维数组的使用和分配 - 王一哲的博文...

    好多年不用C语言了,最后一次使用还是读研的时候写矩量法的时候了,看见VS的界面总能想起当年读书的时候的各种错误,往事随风.本程序应人之约,首先得到一个随机的矩阵,之后通过将矩阵分解为几个小矩阵统计小矩 ...

  9. pb 创建动态二维数组

    pb中二维数组定义:array[10,10] 定义出来的二维数组是固定长度的:无法像一维数组一样动态长度:那PB中如何创建动态二维数组,请看接下来的内容. 1.先创建结构体structure 2.结构 ...

  10. python课程设计矩阵对角线之和_Python二维数组实现求出3*3矩阵对角线元素的和示例...

    Python二维数组实现求出3*3矩阵对角线元素的和示例 题目:求一个3*3矩阵对角线元素之和. 程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出. def two_dime ...

最新文章

  1. 理解并自定义HttpHandler
  2. 泛函分析1-线性空间
  3. 她说程序员不懂浪漫,生日宴上惨变单身狗,其实,程序员的浪漫你不懂!
  4. qq linux版本下载官网下载,腾讯QQ For Linux
  5. bv值是什么意思_BVR电线是什么意思BVR电线电缆规格型号
  6. Python删除文件、删除文件夹
  7. linux db2表空间目录,db2 表空间的一些知识
  8. The operation of Debian is much
  9. bzoj 1016: [JSOI2008]最小生成树计数
  10. 再问:支付宝即时到账集成接口!
  11. 苹果被拒:Guideline 5.0 - Legal
  12. Linux inittab和oracle lsntctl 启动的问题解决办法
  13. vue-router的编程式导航
  14. 用Python写前端
  15. staruml-uml程序员绘图工具简单使用与说明
  16. 微信H5活动抽奖单页面模板源码
  17. 【Golang第6章:排序和查找】golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例
  18. 唐伯虎的诗,可能是改编的
  19. 1.[QT | QCharts | 动态显示]折线图标题字体大小无法更改
  20. php的安装完成后为什么显示空白页?

热门文章

  1. 想要轻松制作GIF图片,来看篇超全面的分析!
  2. 安装和客户端证书颁发---puppet系列
  3. 老司机 iOS 周报 #42 | 2018-11-05
  4. swap分区自动建立配置
  5. 金融科技:科技生活化和生活金融化
  6. VINS(二)Feature Detection and Tracking
  7. JavaScript性能优化之加载与执行
  8. Zendframework 模块加载事件触发顺序。
  9. div中字符串自动换行
  10. 颠覆你想象的150个故事(2)