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

本文为大一时所写的文章(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所指向的内存被释放,不占有空间。
方法二:
声明一个指向指针的指针,并给她分配动态指针数组,分别让每个动态指针数组指向相应的数据区域,有很强的连续性。

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

猜你喜欢

转载自blog.csdn.net/Kevinonlie/article/details/88557822