1 对象指针
Poina a(2,3);
Point* ptr = &a;
通过指针访问对象成员
ptr->getx() == (*ptr).getx
2 this指针
this指针隐含于类的每一个非静态成员函数中
用a.getx()函数时,对象a的地址传给了getx()函数中的隐藏的this指针
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c5a6fa952e8b8662661ed8fe24f473b1.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5b5c7d8cc21e74fb6188667ac8902b82.png)
3 动态内存分配
new 类型名T(初始化参数列表)
程序执行期间,申请用于存放T类型对象的内存空间,并依据初始化列表赋以初值。
结果值:
- 成功:T类型的指针,指向新分配的内存单元,指向首字节的地址
- 如果要申请的空间很大但内存不够,会失败:抛出异常
Point* ptr = new Point; //调用默认构造函数
delete ptr; //删除ptr指向的对象,不是删除这个指针
ptr = new Point(1,2); //调用有参数的构造函数
delete ptr;
4 动态创建对象数组
指向一维数组的指针:
分配:new 类型名T [数组长度]
释放:delete[] 数组名p (数组名p也就是该指针)
Point* ptr = new Point[2]; //创建对象数组
ptr[1].getX();
ptr[2].move();
delete[] ptr;//删除整个对象数组,调用析构函数,一定要[]
指向数组元素的指针(指向一维数组名的指针/指向一维数组首元素地址的指针),指针+1时指向内存中连续存放的下一个数组元素,如下
int a[3] = {1,2,3};
int* ptr = a;
ptr指向a[0]的地址
ptr+1指向a[1]的地址
指向多维数组的指针:
分配:new 类型名T[第一维长度][第二维长度]…
char (*fp)[3]
fp = new char[2][3] //分配
由于括号[]的优先级高于*,要用(*fp),定义时舍去第一个维度
类似于指向函数的指针int (*ptr) (int,int)
指针表现形式:
指向多维数组首地址的指针必须是指向数组的指针(或者说指向首行的指针),,fp+1时会跳跃整个数组空间。
因为,一维数组的首元素是一个数,而二维数组的首元素是一个一维数组。
如下图,char[2][3]看成是两行有3个元素的一维数组构成,fp+1会越过整个行
指向二维数组a[2][3]的指针形式: int(*ptr)[3],舍去第一个维度。
ptr是一个指向含有三个元素的一维数组的指针
ptr指向该数组第一行的地址,ptr+1相当于进入下一行
ptr和a完全等效, *ptr 等同于a[0]使用, *(ptr+1)等同于a[1]使用
#include<iostream>
using namespace std;
int main() {
int a[2][3] = { {11,22,33}, {44,55,66} };
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++)
cout << a[i][j] << " ";
cout << endl;
}
cout << endl;
int(*ptr)[3] = a; //ptr指向二维数组a,也就是指向第1行的地址,ptr和a完全等效
cout << a << endl; //输出第1行的地址
cout << &a << endl; //输出第1行的地址
cout << ptr << endl; //输出第1行的地址
cout << ptr + 1 << endl; //输出第2行的地址
cout << ptr[0][2] << endl; //输出33
cout << (*a)[1] << endl; //输出22
cout << (*ptr)[1] << endl; // 输出22,*ptr == a[0],即输出a[0][1]
cout << (*(ptr+1))[1] << endl; // 输出55,*(ptr+1) == a[1],即输出a[1][1]==55
cout << *(*(ptr + 1) + 2) << endl; // 输出55,*(ptr+1)进入第二行,该式表示第二行第三个
cout << endl;
for (int i = 0; i < 2 ; i++){
for (int j = 0; j < 3; j++)
cout << *(*(ptr + i) + j) << " "; //输出第i行,第j个元素
cout << endl;
}
return 0;
}
指向三维数组int [7][9][8]的指针形式: int (*ptr) [9][8] ,舍去第一个维度
cp是一个指向数组的指针,指向的是9行8列的二维数组,cp+1相当于进入了下一个9行8列板块
cp和数组名完全等效
#include <iostream>
using namespace std;
int main() {
int(*cp)[9][8] = new int[7][9][8];
for (int i = 0; i < 7; i++)
for (int j = 0; j < 9; j++)
for (int k = 0; k < 8; k++)
*(*(*(cp + i) + j) + k) = (i * 100 + j * 10 + k);
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 9; j++) {
for (int k = 0; k < 8; k++)
cout << cp[i][j][k] << " ";
cout << endl;
}
cout << endl;
}
delete[] cp;
return 0;
}
5 指针总是只能在一个维度移动,n维数组的指针是指向n-1维数组的。
一维数组:
(1)一维数组名指向其第一个元素
二维数组:
(1) 二维数组实际上就是元素为一维数组的数组
(2) 二维数组名可以看做指向其第一个元素(一维数组)的指针,
(3)二维数组的指针是指向一维数组的指针,所以指针ptr与数组名通用
int a[2][3];
int (*ptr)[3] = a;
ptr == a;
*ptr == *a == a[0]
三维数组:
(1)三维数组实际上就是元素为二维数组的数组
(2)三维数组名可以看做指向其第一个元素(二维数组)的指针
(3)三维数组的指针cp是指向二维数组的指针,所以指针cp与数组名通用