指针和动态数组 new ,delete

............心中要有一内存块,以便理解知识
计算机储存数据必须知道数据的3种属性:
1.存储在何处.......并起名
2.值
3.类型
(1)int a;a=30;
(2)int *b=&a;
(3).int *a,b;注意...整型....指针a,整型...变量b,对每个指针都要有一个*;

.......................指针..........................................
1.指针是一个变量,存储的是...值的地址,而不是值本身,
指针变量 是指向特定变量类型指针,和数组相似
..int* tax;...............指向int变量的指针,又叫整型指针
..double * str;.............指向double变量的指针
..int 指针和double指针虽然指向的数据类型不同, 但这两个变量本身长度的通常是一样的,好比1016可能是超市的地址,也可能是,村庄的地址一样,.....地址的长度或值,不能指示该地址上有什么建筑物,也不指示有关变量的长度或类型的任何信息


.显示地址,cout常用16进制

.......................指针与c++原理..........................................
oop强调的是运行阶段进行决策;
如:声明一个数组
要在c++中声明一个数组必须指定长度,一般包含20个元素的数组已经够用,int a[20],但有时需要200元素,为了安全起见,又定义了int a[200],这就造成了内存的浪费,为此c++就采取的方法是,使用关键字new,运行时分配内存,并使用指针来跟踪分配内存的位置

.................................指针的危险....................................................
极其重要的一点:
在c++....创建指针时,计算机只分配.....用来存储.地址的内存.,不给指向的数据分配内存
警告:
定义指针时最好指定一个,明确的,适当的地址...
...................................指针和数字...........................................................................
int *pt;
pt=0xB80000;错误,对0xB80000编译器认为是数字,不会当地址;要这样

pt=(int*)0xB80000;
注意:pt是int值的地址,但并不意味着pt本身的类型是int...
..............................使用new来分配内存.............................................................................
只能通过指针来访问,在运行时用new分配的未命名的...内存(以存储值)
int * pt,a;
pt=&a;a的地址有两种访问方式,通过a和pt
int * pt=new int ....申请int变量的内存,并将地址赋给pt;只能通过pt访问
pt指向的内存称为.....数据对象(指的是为数据项分配的内存)常说,内存块
通用格式:
type *指针名=new type ;//只在程序运行时才执行,编译时不执行
type可以是..结构和基本类型
值为0的指针称为空指针

...........................................使用delete释放内存...................................
1.需要内存块时...用new操作符来申请,使用完内存块后用delete操作符..归还给内存池
.....int * ps=new int;
........delete ps;释放ps指向的内存块,,但不会删除ps指针本身,ps可以重新指向另一个新分配的内存块。
2.一定要配对使用new和delete ,否则内存泄露,就是说......被分配的 内存.....再也无法使用了,则程序将由于不断寻找更多内存而终止
......int * ps=new int;
........delete ps;ok
........delete ps;not ok,不可释放已释放的内存

int jug=5;
.....int * pd=&jug;
........delete jug;not ok,不要使用delete来释放...声明变量来获得的内存
警告:只能使用delete来释放new分配的内存,不过,对空指针使用delete是安全的;

int* a=new int;
int* b=a;
delete b;也对,释放的内存块就是new分配的,
但一般不让两个指针都指向..同一内存块,会增加重复删除同一内存块的可能性
..........................................使用new来创建动态数组...............................................
new的用武之地在大型数据,如数组,字符串,结构,类
声明的数组,编译时就为它分配内存,不管运行时用不用,称静态联编
使用new,运行时需数组要就建,不需要就不建,还可以在运行时选择数组长度,称动态联编
使用new为数组分配的格式;
类型 * 指针名=new 类型 [lenth];指针指向数组首地址
相应的 delete [] 指针名 ;释放整个数组占用的内存块
example:
int* psome=new int [10];
delete [] psome;
实际上,程序还跟踪了分配的内存量,以便用delete能正确释放全部内存, 但这些
这些信息是不公开的,不能使用sizeof操作符来确定动态分配数组包含的字节数
..........................................动态数组的使用.................................................................
# include <iostream>
using namespace std;
int main()
{

double *p3=new double [3];//心中要有一个内存块 和一个手指
p3[0]=0.2;//将指针p3当数组名来使用
p3[1]=0.5;
p3[2]=0.8;

p3=p3+1;//数组名和指针之间的根本区别:数组名的值无法修改,指针可以算术运算
cout<<p3[1];
p3=p3-1;//指针指向原来的值,给delete[]提供正确的地址

delete [] p3;
return 0;

}

原文地址:https://www.cnblogs.com/wangjixianyun/p/3046656.html