一、数组:
数组名字是数组首元素的内存地址,实质是一个指针常量,不能被赋值。
多维数组要转化为一维方式存储,(计算机内存是一维编址的),越右边的下标变化越快
数组名作参数,传送的是数组首地址,对形参数组元素值的改变,会影响到实参。
对象数组:类名 数组名[常量表达式] 访问:数组名[…].成员名
二、指针:
内存空间的访问方式:①通过变量名直接访问 ②通过地址间接访问
指针:用于存放内存单元地址的变量类型,用于间接访问内存。
指针变量:指针类型的变量,用于存放地址的变量。
指针数组:例如:int *p[3];每个元素都是指针变量。
指向常量的指针:const int *p1不能通过指针来改变所指对象的值,但指针本身能改变。例如int a, b; const int *p = &a; p = &b;√ *p = 10;×
指针类型的常量:int * const p2 指针本身的值不能改变。
指针型函数:返回值是指针(把大量数据返回主调函数)。
指向函数的指针:例如int(*p)(float); (float处为形参表) (数据指针指向数据存储区,函数指针:程序代码存储区)。
对象指针:
① 例如:Point a(4,5); Point *p = &a; p->getX();通过对象指针,可以访问到对象的公有成员。
② this指针。。
③ 指向类的非静态成员的指针。。。
④ 指向类的静态成员的指针(访问不依赖对象,通过普通指针)
三、动态内存分配:
堆对象:在程序运行过程中申请和释放的存储单元
建立和删除堆对象使用两个运算符:new和delete(不用会导致内存泄漏)
动态管理数组类型对象:
例如int *p = new int[10]; …… delete[]p;
Int *p1 = new int[10][5]; (p和p1中10处可以用变量,而p1的其他维比如5那要求是常量)
注意:char(*p)[3][4]; int i = 2; p = new char[i][3][4]为产生指向3*4的二维char型数组的指针,char(*p1)[3]; p = new char[2][3]; 为指向一维数组的指针
四、当类的数据成员中有指针类型时要注意别用浅复制而要用深复制。
因为用浅复制调用默认构造函数,实现对应数据项的直接复制,两个对象的指针指向的是同一个内存地址,并没有形成真正的副本。两个对象共用了同一块内存空间,该空间被两次释放,会导致运行错误。
再补充两个运算符:
*:①声明时:int *p; 声明时是指针
②执行 或 声明语句的初始化表达式中: cout << *p; 或 int a = *p; 表示访问指针所指对象的内容
&:①声明时:int i; int &r = i 声明的是引用
②执行 或 给变量赋值时出现在等号右边:
cout << &r; 或 int a; int *p = &a;表示取对象的地址。