指针类型

指针是“指向(point to)”另外一种类型的复合类型。复合类型是指基于其它类型定义的类型。

指针**在 C++ 是保存另一个变量的存储器地址的变量。
引用**是一个已经存在的变量的别名。
一旦引用被初始化为一个变量,它就不能被更改为引用另一个变量。

理解指针,先从内存说起:内存是一个很大的、线性的字节数组。每一个字节都是固定的大小,由 8 个二进制位组成。最关键的是,每一个字节都有一个唯一的编号,编号从 0 开始,一直到最后一个字节。

程序加载到内存中后,在程序中使用的变量、常量、函数等数据,都有自己唯一的一个编号,这个编号就是这个数据的地址。

指针的值实质是内存单元(即字节)的编号,所以指针单独从数值上看,也是整数,他们一般用16进制表示。指针的值(虚拟地址值)使用一个机器字的大小来存储,也就是说,对于一个机器字为w位的电脑而言,它的虚拟地址空间是指针 - 图1,程序最多能访问指针 - 图2个字节。这就是为什么 xp 这种 32 位系统最大支持 4GB内存的原因了。

用来保存指针的对象,就是指针对象。如果指针变量 p1 保存了变量 a 的地址,则就说:p1 指向了变量a,也可以说 p1 指向了 a 所在的内存块 ,这种指向关系,在图中一般用 箭头表示:
image.png

  1. // 普通变量
  2. int a = 3;
  3. // 定义了变量a,int类型,值为3.内存中有一块内存空间是放a的值
  4. // 对a的存取操作,就是直接到这个内存空间存取
  5. // 内存空间的位置,叫地址
  6. // 存放 3 的地址,可以用 取地址操作符 & 得到,&a
  7. // 指针变量
  8. int *p = NULL;
  9. // 定义了一个指针变量 p,p指向一个内存空间,里面存放的是一个内存地址
  10. // 现在赋值为NULL(就是0,表示特殊的空地址),空指针
  11. // 申请一个空间给 p,*p内容不确定
  12. int *p = new(int);
  13. // 给指针变量 p 赋值, & 发音 and
  14. p = &a;
  15. // 把 a 变量的内存空间地址给了 p
  16. // 直接对 p 存取,操作的是地址
  17. // 通过这个地址,间接地操作,才是整数3
  18. // p的间接操作要使用指针操作符 *, *p 的值才是3
  1. // 指针定义
  2. // 类型说明符 *指针变量名
  3. int a = 10;
  4. int *p;
  5. // 取地址运算符 &
  6. p = &a;
  7. // 间接运算符 *,解引用符 *
  8. *p = 20;
  9. // 指针变量直接存取的是内存地址
  10. cout << p << '\n'; // 0x4097ce
  11. // 间接存取的才是存储类型的值
  12. cout << *p << '\n'; // 20
  1. // *有靠近变量类型的,有靠近变量名称的
  2. // 有什么区别呢
  3. int *p;
  4. int* p;
  5. // *靠近哪一个都可以,编译器都会认为是指针变量,所以本质是一样的
  6. // 推荐靠近变量名称写 int *p
  7. int &ret;
  8. int& ret;
  9. // 这个也是同理