本文为大一时所写的文章(2017/4/9),文笔还很生疏,在很多问题上认识不深,算是在学校的微信公众号上的一个编程探究模块上的投稿,本人当时也参与了本模块的维护和管理。补档。
今天我们来聊聊二维数组及其二维数组的动态内存分配关知识。

1.数组的基本定义

我们都知道,数组是典型的线性存储,是一种最基本的存储表示方法,
把逻辑上相邻的元素存储在物理位置相邻的存储单元中,由此得到的存储表示称为线性存储结构。
更直白的来讲,我们可以将数组看成一次性声明一连串的类型相同的变量,他们在逻辑上联系,在物理上也连续,通过偏移量来访问内容。
拜此所赐,数组几乎可以使用你所知道的任何一种数据类型来声明
例如

数组的特性使她在处理一些数据类型相同但数据庞大的工程有一定的优势。

2.二维数组的基本定义

二维数组是一维数组的“升级”版
形式为:函数名 数组首地址[行][列]
在逻辑上申请了一个二维空间,分配的大小是行数据类型类型大小,但根据数组定义可知,通过偏移量访问,物理上的地址还是连续的。

例如:

二维数组本质上也是线性存储,假设二维数组是2*2大小,那么A[0][1]所在内存块的下一块内存就是A[1][0],在物理位置上是连续的。

3.数组的局限性

在实际生活中,有时候需要你输入的数据长度是不确定的,而数组在声明的时候可以用常量表达式或者宏替换(defline)但不能使用变量确定数组长度。因为数组的声明在编译阶段,生命周期是当前声明的那块区域了,无法改动。
例如这样的声明是不被允许的
这样的声明是正确的
那么我们如何能按需分配内存空间,做到不浪费内存更优化程序呢?这就要提到malloc()和free()函数了。

4.二维数组的动态分配

这里先了解malloc()和free()函数。
函数形式void malloc(size) void free(void
malloc()作用是在内存的动态存储区分配一块长度为size字节的连续区域,函数的返回值为该区域的首地址。
free()作用是释放指针指向的区域内存。
方法一:
根据数组定义可知,二维数组也是一连串数据的线性存储,希望声明一个a[x][y]长度的内存空间可以通过申请长度为x
y的方式实现。
参考程序:

结果为
指针p指向了一个“二维”数组,长度由键盘输入,程序简单容易理解。
最后p所指向的内存被释放,不占有空间。
方法二:
声明一个指向指针的指针,并给她分配动态指针数组,分别让每个动态指针数组指向相应的数据区域,有很强的连续性。



用指针实现可以显著减少内存的浪费,让程序运行更加健壮。
下期暂定讨论结构体相关知识。
由于本人的能力有限,程序不可避免的会有瑕疵,请各位同学斧正!

二维数组及其二维数组的动态内存分配相关推荐

  1. 浅谈C语言动态内存分配及柔性数组

    文章目录 前言 1.动态内存的简单介绍 1.动态内存分配是什么? 2.为什么存在动态内存分配? 3.动态内存分配具体方法 1.动态内存函数 2.动态内存注意事项 2.经典面试题分析 3.C/C++程序 ...

  2. 使用malloc动态内存分配一个二维数组

    由于一部分编译器(比如说vs 2019)不支持创建数组时元素个数为变量,今天使用malloc来实现此功能. 详细注释和代码如下 //动态内存分配 模拟二维数组 #include<stdio.h& ...

  3. 二维数组及其动态内存分配

    一.二维数组的基本概念 1.1 二维数组的内存映像 从内存角度看,二维数组和一维数组一样,在内存中都是连续分布的多个内存单元,并没有本质差别,只是内存的管理方式不一样,如下图所示 一维数组int a[ ...

  4. 实验5.2 动态内存分配生成动态数组完成矩阵转置

    题目 使用动态内存分配生成动态数组来完成矩阵转置,使用指针实现函数的功能 AC的C++代码如下: #include<iostream> using namespace std; void ...

  5. Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组...

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:什么是静态内存什么又是动态内存呢? 静态内存:是指在程序开始运行时由编译 ...

  6. 【C/C++动态内存 or 柔性数组】——对动态内存分配以及柔性数组的概念进行详细解读(张三 or 李四)

    目录 前言(栈区.堆区.静态区) 动态内存函数 malloc与free calloc与free realloc与free 常见的动态内存错误 经典笔试题(再见张三) 柔性数组 前言(栈区.堆区.静态区 ...

  7. 动态内存分配与柔性数组

    什么时动态内存分配 一般我们写程序都是在栈区分配空间,如果我们想根据需求想随时存放随时释放数据,堆区可以实现根据需求想系统申请所需大小的空间. 建立内存的动态分配 内存的动态分配是通过系统提供的函数来 ...

  8. c语言动态内存分配数组,【C】动态内存分配

    ## 动态内存分配的意义 C语言中的一切操作都是基于内存的 变量和数组都是内存的别名 内存分配由编译器在编译期间决定 定义数组的时候必须指定数组长度 数组长度是在编译期就必须确定的需求: 程序在运行过 ...

  9. 在c语言中,可以使用动态内存分配技术定义元素个数可变的数组,C语言复制在线考题1精选.doc...

    C语言复制在线考题1精选 窗体顶端 <C语言程序设计208304>综合测试 返回测验列表 大项 1 / 2 - 单项选择题 60.0/ 70.0 分 本大题共35道,每题2分,共计70分, ...

最新文章

  1. 香港中文大学 (深圳) -博士硕士招生 -智能优化及规划方向
  2. iOS UI基础-6.0 UIActionSheet的使用
  3. Linux:目录操作
  4. 算法整理:Boyer-Moore 投票算法
  5. 《深入理解Java虚拟机》读书笔记五
  6. 华科10年保送生计算机考研复试机试
  7. 【华为云实战开发】8.如何快速搭建C#网站并实现持续集成?
  8. 半径为r的均匀带电球体_一半径为R的均匀带电球体,其电荷的体密度为ρ.求(1)球外任一点的电势;(2)球表面上的电势;(3...
  9. ganglia的搭建以及添加被监控主机
  10. 模型堆叠(Stacking)和模型融合的原理与实现以及一个库heamy的介绍
  11. android列表的默认值,ListPreference默认值没有显示
  12. dll找不到dll electron_electron之集成node-ffi-napi
  13. android flash插件安装失败,安卓手机怎么安装Adobe Flash Player插件
  14. linux ps命令什么意思,linux之ps命令详解
  15. 对10G/40Gphy中auto-negotiation功能调试
  16. 7-2 jmu-python-汇率兑换
  17. [OpenCV] cv.remap() 重映射学习笔记/map1 map2易混点
  18. Docker 使用容器数据卷 实现宿主机与容器共享数据 容器数据持久化
  19. 1096:数字统计(信奥)
  20. PPT中建立打开Onenote特定笔记本的超链接

热门文章

  1. 台式电脑 计算机管理在哪里,电脑设备管理在哪,详细教您如何打开电脑设备管理...
  2. 《大话计算机》同款T恤,我要了!!
  3. 无论你是否主力 Swift, 这些事情你都可以了解一下
  4. win7系统下安装cad
  5. 王权富贵:RCNN的成长历程
  6. 【CLion】clion最新版下载安装+破解+汉化
  7. zabbix前端无法访问,报502 BAD GATEWAY错误
  8. 川菜馆|文科生的python挑战(1)——字符串
  9. arm linux 时钟源 信息,Linux时间子系统之一:clock source(时钟源)
  10. 利用Python整理TGA的导出数据,成为Excel格式的