标签:
int * pn; 2.int i = 5; 3.pn = new int[i * 20]; 4.pn[0] = 20;
int * p = new int; 2.* p = 5; 3.delete p;
#include <iostream.h> 2.#include <string.h> 3.void main(){ 4. int n; 5. char *pc; 6. cout<<"请输入动态数组的元素个数"<<endl; 7. cin>>n; //n在运行时确定,可输入17 8. pc=new char[n]; //申请17个字符(可装8个汉字和一个结束符)的内存空间 9. strcpy(pc,“堆内存的动态分配”);// 10. cout<<pc<<endl; 11. delete []pc;//释放pc所指向的n个字符的内存空间 12. return ; 13.}
5. 动态一维数组的说明
① 变量n在编译时没有确定的值,而是在运行中输入,按运行时所需分配堆空间,这一点是动态分配的优点,可克服数组“大开小用”的弊端,在表、排序与查找中的算法,若用动态数组,通用性更佳。一定注意:delete []pc是将n个字符的空间释放,而用delete pc则只释放了一个字符的空间;
② 如果有一个char *pc1,令pc1=p,同样可用delete [] pc1来释放该空间。尽管C++不对数组作边界检查,但在堆空间分配时,对数组分配空间大小是纪录在案的。
③ 没有初始化式(initializer),不可对数组初始化。
6.指针数组和数组指针
指针类型:
(1)int*ptr;//指针所指向的类型是int
(2)char*ptr;//指针所指向的的类型是char
(3)int**ptr;//指针所指向的的类型是int* (也就是一个int * 型指针)
(4)int(*ptr)[3];//指针所指向的的类型是int()[3] //二维指针的声明
指针数组:
一个数组里存放的都是同一个类型的指针,通常我们把他叫做指针数组。
比如 int * a[2];它里边放了2个int * 型变量 .
int * a[2]; a[0]= new int[3]; a[1]=new int[3]; delete a[0]; delete a[1];
注意这里 是一个数组,不能delete [] ;
数组指针:
一个指向一维或者多维数组的指针.
int * b=new int[10]; 指向一维数组的指针b ;
注意,这个时候释放空间一定要delete [] ,否则会造成内存泄露, b 就成为了空悬指针
int (*b2)[10]=new int[10][10]; 注意,这里的b2指向了一个二维int型数组的首地址.
注意:在这里,b2等效于二维数组名,但没有指出其边界,即最高维的元素数量,但是它的最低维数的元素数量必须要指定!就像指向字符的指针,即等效一个字符串,不要把指向字符的指针说成指向字符串的指针。
int(*b3) [30] [20]; //三级指针――>指向三维数组的指针;
int(*b2) [20]; //二级指针;――>指向二维数组的指针;
b3=new int [1] [20] [30];
b2=new int [30] [20];
删除这两个动态数组可用下式:
delete [] b3; //删除(释放)三维数组;
delete [] b2; //删除(释放)二维数组;
在堆中建立动态多维数组
new 类型名[下标表达式1] [下标表达式2]……;
例如:建立一个动态三维数组
float (*cp)[30][20] ; //指向一个30行20列数组的指针,指向二维数组的指针
cp=new float [15] [30] [20]; //建立由15个30*20数组组成的数组;
注意:cp等效于三维数组名,但没有指出其边界,即最高维的元素数量,就像指向字符的指针即等效一个字符串,不要把指向字符的指针,说成指向字符串的指针。这与数组的嵌套定义相一致。
来源:我以前的博客:(已经停止更新) http://blog.csdn.net/p641290710/article/details/28302495
标签:
原文地址:http://www.cnblogs.com/pengjunwei/p/4214973.html