指针类型
指针是“指向(point to)”另外一种类型的复合类型。复合类型是指基于其它类型定义的类型。
指针**在 C++ 是保存另一个变量的存储器地址的变量。
引用**是一个已经存在的变量的别名。
一旦引用被初始化为一个变量,它就不能被更改为引用另一个变量。
理解指针,先从内存说起:内存是一个很大的、线性的字节数组。每一个字节都是固定的大小,由 8 个二进制位组成。最关键的是,每一个字节都有一个唯一的编号,编号从 0 开始,一直到最后一个字节。
程序加载到内存中后,在程序中使用的变量、常量、函数等数据,都有自己唯一的一个编号,这个编号就是这个数据的地址。
指针的值实质是内存单元(即字节)的编号,所以指针单独从数值上看,也是整数,他们一般用16进制表示。指针的值(虚拟地址值)使用一个机器字的大小来存储,也就是说,对于一个机器字为w位的电脑而言,它的虚拟地址空间是,程序最多能访问个字节。这就是为什么 xp 这种 32 位系统最大支持 4GB内存的原因了。
用来保存指针的对象,就是指针对象。如果指针变量 p1 保存了变量 a 的地址,则就说:p1 指向了变量a,也可以说 p1 指向了 a 所在的内存块 ,这种指向关系,在图中一般用 箭头表示:
// 普通变量
int a = 3;
// 定义了变量a,int类型,值为3.内存中有一块内存空间是放a的值
// 对a的存取操作,就是直接到这个内存空间存取
// 内存空间的位置,叫地址
// 存放 3 的地址,可以用 取地址操作符 & 得到,&a
// 指针变量
int *p = NULL;
// 定义了一个指针变量 p,p指向一个内存空间,里面存放的是一个内存地址
// 现在赋值为NULL(就是0,表示特殊的空地址),空指针
// 申请一个空间给 p,*p内容不确定
int *p = new(int);
// 给指针变量 p 赋值, & 发音 and
p = &a;
// 把 a 变量的内存空间地址给了 p
// 直接对 p 存取,操作的是地址
// 通过这个地址,间接地操作,才是整数3
// p的间接操作要使用指针操作符 *, *p 的值才是3
// 指针定义
// 类型说明符 *指针变量名
int a = 10;
int *p;
// 取地址运算符 &
p = &a;
// 间接运算符 *,解引用符 *
*p = 20;
// 指针变量直接存取的是内存地址
cout << p << '\n'; // 0x4097ce
// 间接存取的才是存储类型的值
cout << *p << '\n'; // 20
// *有靠近变量类型的,有靠近变量名称的
// 有什么区别呢
int *p;
int* p;
// *靠近哪一个都可以,编译器都会认为是指针变量,所以本质是一样的
// 推荐靠近变量名称写 int *p
int &ret;
int& ret;
// 这个也是同理