【【2023最新版C++】实战项目教程,清华武老师带你零基础一套快速学会c++】 https://www.bilibili.com/video/BV1eL41187JS/?share_source=copy_web&vd_source=6ecc92141938badce449ff0f5edde584
1.指针
访问内存的最小单元是字节,数据保存在内存中具有连续编号的一串字节中。
指针保存的信息是另外一个数据对象在内存中的地址,通过指针可以访问到指向的那个对象。
(1)指针的定义
int* p1;//指向int类型数据的指针
long* p2;//指向long类型数据的指针
sizeof(p1)指地址的长度,与所指数据类型无关(64位系统8字节,32位系统4字节)
(2)指针的用法
1)获取对象地址给指针赋值
取地址操作符&
2)通过指针访问对象
解引用操作符“*” *p
(3)无效指针、空指针和void*
1)无效指针
未初始化的指针进行解引用和赋值
int* p1; *p1=100;//可能将100赋值到不可操作的地址上
2)空指针
定义方式为:
int* np= nullptr;
np = NULL;
np = 0;
3)void* p
该指针可指向任意类型的数据,但不可以进行解引用*p操作,因为不知道指向的数据类型,也就不知道数据的长度
(4)指向指针的指针
** 二级指针,即该指针指向一个类型为指针的数据对象,***三级指针
解引用操作也相应为:* (指向的指针)**(指向的指针所指向的数据)
(5)指针和const(关键:const和*的位置)
1)指向常量的指针
const int c1 = 10;
int* pc = &c1;//错误
const int *pc = &c1;//正确
*pc不可改,pc可改
2)指针常量
int i;
int* const cp = &i;//cp为常量
cp不可改,*cp(cp地址所指向的数据非常量)可改变
3)const int * const p;
(6)指针和数组
输出数组名arr,实际为&arr[0]
int* pia = arr; //√ *pia即arr[0]
指针加1:实际加的是一个数据长度
(7)指针数组和数组指针
1)指针数组
数组,数组的所有元素为相同类型的指针
int* pa[5];//5个元素均为int*
2)数组指针
int (* ap)[5];//ap为指针,指向包含五个元素的数组
一个指向数组的指针
arr为数组名
ap=arr;//右边arr为int*,左边ap为指向数组的指针,故不正确,应使用&arr(?理解)
ap= &arr; *ap = arr;//*ap为arr,即arr[0]地址,**ap为arr[0]
2.引用
为数据对象另外起个名字,引用的本质是别名,并不是数据对象,不会存储数据,不占内存空间。
变量前加“&”,注意与对变量取地址区分,此处用于声明变量
(1)定义声明
int a;
int& ref = a;//必须初始化,ref=a,与a进行绑定,对ref操作也即对a操作
(2)对常量的引用
const int zero = 0;
相应的引用:
const int& cref = zero;//与常量一样,也不能进行赋值
可以用常量引用 普通变量,此时无法通过该引用常量来修改普通变量的值:
int i;
const int& ref = i;
ref =10;//错误
(3)引用和指针常量
绑定指针的引用
int* ptr = &a;
int*& pref = ptr
没有int &* 指向引用的指针