首页 理论教育 动态数组实现方法:使用指针

动态数组实现方法:使用指针

时间:2023-11-23 理论教育 版权反馈
【摘要】:图7-17动态开辟二维数组存储结构图本任务我们学习了利用指针和动态内存分配函数来开辟和使用一维数组及二维数组的方法,熟练掌握这些方法,必将给我们处理数据和编程带来极大方便,提高我们处理数据的灵活性和能力,希望大家深入理解,努力练习。

动态数组实现方法:使用指针

利用指针分配的连续的内存单元数组的存储形式是一样的,从起始地址开始,每一个存储单元也可以从0开始编号,这些编号同样可以被认为是这些内存单元的下标。因此通常对于利用动态内存分配得到连续内存空间,也可以称为是动态数组,其使用方法我们前边都已经学习过,可以按照数组名加下标的方式使用它的每一个单元,也可以按照数组中的地址关系,利用每一个单元的地址做间接的内存访问。下边通过例子学习利用动态内存分配开辟、使用一维数组和二维数组的方法。

1.利用动态内存分配开辟一维数组

【例7-17】输入n个整数并按输入顺序将这n个整数逆序输出,n由键盘输入。

【程序说明】

(1)stdlib.h是动态内存分配函数的头文件,也可以使用malloc.h。

(2)程序中先输入数据的个数n,然后使用动态分配函数malloc分配了n个整型的存储单元。

(3)sizeof()是C语言中提供的一个运算符,其功能是计算某个类型的存储单元所分配的字节个数,比如sizeof(int)的值为4,是一个int单元所分配的字节个数。通常情况下程序员并不需要知道每一种数据类型在内存中到底分配多少字节,需要时直接用sizeof()计算即可。

(4)malloc(n*sizeof(int))分配n个整型单元总共所需的字节数,也可以用calloc函数来分配,其书写格式为calloc(n,sizeof(int)),显然二者等价,只是书写形式上的差别。

(5)由于分配的n个单元要存放int数据,该内存区的首地址就是一个指向int单元的指针,因此malloc前边使用强制类型转换(int*)并将转换后的地址赋给指针变量p,从定义可知p就是指向整型单元的指针。在使用malloc函数分配内存时,一定要注意赋值号两边的地址类型应该一致。

(6)由于p中保存了所分配单元的首地址,在输入数据时使用p+i表示每一个存储单元的地址,而在输出语句中,使用p[i]表示每一个存储单元,这里用到的显然就是一维数组中的指针关系。

(7)由malloc动态分配的内存区域可以看成是一个动态数组,而直接定义的数组相对应的可以称为静态数组。动态数组的长度可以根据需要动态分配,分配以后还可以使用realloc函数重新分配内存,这就使得存储数据时非常灵活,克服了静态数组长度固定的缺点。(www.xing528.com)

2.利用动态内存分配开辟二维数组

由于计算机内存是一维的,因此不能够在内存中直接开辟出二维数组。根据前边所学可知,系统在存储二维数组时实质上是将二维数组作为一维数组的集合处理,因此可以开辟多个相同类型的一维数组并将之作为二维数组来使用。

【例7-18】利用动态内存分配开辟一个m行n列的二维数组,m和n的值由键盘输入。

由程序中的输入输出可知,在使用动态分配的内存时,我们完全是按照二维数组的使用方法来使用。下面对程序中的关键点简单说明:

(1)程序中arr是一个指向指针的指针,语句arr=(int**)malloc(m*sizeof(int*))开辟了一个长度为m的一维数组,该数组每一个单元中可以存放一个指向整型单元的指针(int*)。

(2)语句for(i=0;i<m;i++)arr[i]=(int*)malloc(n*sizeof(int))循环m次,开辟了m个长度为n的一维数组,数组每一个单元中可以存放一个整型数据。由于开辟了m个长度为n的一维数组,因此将得到m个数组的首地址,这m个首地址该如何管理?长度为n的一维整型数组,数组首地址应该为指向整型的指针,而arr[i]就是一个指向整型的指针,因此可以将这m个长度为n的整型数组的首地分别址赋给arr[i]。分配空间后形成的存储结构如图7-17所示。

(3)由前边所学的指向指针的指针等知识可知,图7-17中的存储结构完全可以作为二维数组来使用。当然,我们也可以根据其中的地址关系利用指针来对其中的每一个单元做间接内存访问。这些知识我们前边都已经讲过,这里不再赘述。

图7-17 动态开辟二维数组存储结构图

本任务我们学习了利用指针和动态内存分配函数来开辟和使用一维数组及二维数组的方法,熟练掌握这些方法,必将给我们处理数据和编程带来极大方便,提高我们处理数据的灵活性和能力,希望大家深入理解,努力练习。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈