在传统C语言程序中,描述顺序表的存储表示有两种方式:静态方式、动态方式
顺序表的静态存储表示:
#define maxSize 100 typedefintT; typedefstruct{ T data[maxSize]; intn; }SeqList;
存储数组的大小和空间已经固定分配,一旦数据空间占满,再加入新的数据结构就会产生溢出,此时存储空间不能扩产,会导致程序停止工作。
顺序表的动态存储表示:
typedefintT; typedefstruct{ T *data; intmaxSize , n; }SeqList;
存储数组的空间是在程序执行过程中通过动态存储分配的语句分配的,一旦数据空间占满,可以另外再分配一块更大的存储空间,用以代换原来的存储空间。同时将表示数组大小的常量maxSize放在顺序表的结构内定义,可以动态的记录扩产后的数组空间大小。
数组定义的方法:
注意:new操作的结果有类型(第一个元素的地址),只能赋值给同类型指针变量
int i[] ={1,2,3,4}; int *a = new int[5]; delete[] a;
二维数组:
大部分语言按照行优先把二维数组存放在一维数组中
int a[2][3]={{1,2},{3,4}}; //a为2列3行,第三行元素为0 int** Copy = new int*[m]; //Copy为m行n列 for(int i=0; i<m; i++){ Copy[i]=new int[n]; for(int j=0; j<n; j++) Copy[i][j]=0; }
也可以使用void *malloc(unsigned int size)在堆区显式地申请大小为size的内存空间,返回空间首地址,类型为void*
空间存储具体类型数据时,需要显式地进行强制类型转换
int *p1 = (int *)malloc(n*sizeof(int)); free(p1); //即使释放数组,也只要给出指向第一个元素的指针
new和delete,是c++的关键字,它本身不是函数。new不依赖于头文件,c++编译器就可以把new编译成目标代码
malloc和free,是libc里面实现的函数,需要引入头文件stdlib.h
注意:使用delete和free撤销动态数组时,指针必须指向第一个元素
⭐️使用typedef定义数组的方法:
typedef int A[5]; A a; //第一句话定义A是一种元素为int大小为5的数组类型,第二句利用A定义一维数组变量a typedef int A[5];A a[5]; //第二句利用A定义量a是5*5的二维int数组