6.数组、指针

一、数组:

数组名字数组首元素的内存地址,实质是一个指针常量,不能被赋值。

多维数组要转化为一维方式存储,(计算机内存是一维编址的),越右边的下标变化越快

数组名作参数,传送的是数组首地址,对形参数组元素值的改变,会影响到实参。

对象数组:类名 数组名[常量表达式] 访问:数组名[…].成员名

二、指针:

内存空间的访问方式:①通过变量名直接访问 ②通过地址间接访问

指针:用于存放内存单元地址的变量类型,用于间接访问内存。

指针变量:指针类型的变量,用于存放地址的变量。

指针数组:例如: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;表示取对象的地址。

原文地址:https://www.cnblogs.com/GraceSkyer/p/6230739.html