5.29C++:对象指针、this指针、动态内存分配、重点:数组与指针!!!

1 对象指针

Poina a(2,3);
Point* ptr = &a;

通过指针访问对象成员
ptr->getx() == (*ptr).getx

2 this指针

this指针隐含于类的每一个非静态成员函数中
用a.getx()函数时,对象a的地址传给了getx()函数中的隐藏的this指针
在这里插入图片描述
在这里插入图片描述
3 动态内存分配

new 类型名T(初始化参数列表)
程序执行期间,申请用于存放T类型对象的内存空间,并依据初始化列表赋以初值。
结果值:

  1. 成功:T类型的指针,指向新分配的内存单元,指向首字节的地址
  2. 如果要申请的空间很大但内存不够,会失败:抛出异常
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与数组名通用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值