复合类型

复合类型是基于其它类型定义的类型,如指针和引用。

引用

  • 引用是为对象起了另外一个名字,引用类型引用另外一种类型。
  • 定义引用类型时必须初始化。
  • 定义引用类型时,程序把引用和它的初值绑定在一起,而不是将初始值拷贝给引用。
  • 引用一旦初始化就将和它的初值永远的绑定在一起,不能再将引用绑定到另外的对象。
  • 定义一个引用后,对于引用的任何操作实质上都是对引用绑定对象的操作。
  • 引用不是一个对象,所以不能定义引用的引用。
  • 引用只能绑定到对象上,而不能与字面值或某个表达式的计算结果绑定。
  • 引用的类型必须与它绑定的对象严格匹配。

指针

  • 指针本身就是一个对象,所以存在指向指针的指针。
  • 在指针的声明周期里可以指向几个不同的对象。
  • 定义指针时不一定必须赋值,定义在块作用域内的指针如果没有被初始化,将拥有一个不确定的值。
  • 指针类型要和它所指向的对象严格匹配。

指针的值

  • 指向一个对象。
  • 指向紧邻对象所占空间的下一个位置。
  • 空指针,意味着指针没有指向任何对象。
  • 无效指针,除了上述情况以外的其他值。

试图拷贝或以其它形式访问无效的指针的值都将引发错误。

空指针

空指针不指向任何对象,试图使用一个指针之前代码可以先检查它是否为空。

生成空指针的方法:

int *p = nullptr;  //C++ 11新标准
int *p = 0;
int *p = NULL;	//需要包含头文件<cstdlib>

指针的一般操作

  • 只要指针拥有一个合法的值,就可以将其用在条件表达式中,任何非0的指针对应的条件值都是 true
  • 对于两个类型相同的合法指针,可以用 ==!= 操作符对其进行比较。两个指针相等的情况:
    • 它们都是空指针。
    • 它们都指向同一个对象。
    • 它们都指向同一个对象的下一个地址。

void* 指针

void* 指针是一种特殊的指针类型,可用于存放任意对象的地址。

不能直接操作 void* 所指向的对象,因为并不知道这个对象究竟是什么类型,也就无法确定能在这个对象上做哪些操作。

利用 void* 指针可以做事:

  • 拿它和别的指针比较
  • 作为函数的输入或输出
  • 赋给另一个 void* 指针。

理解复合类型的声明

定义多个变量

int *p1,p2; //p1是指向int的指针,p2是int
int *p1,*p2; //p1,p2都是指向int的指针

指向指针的指针

通过*可以区别指针的级别,** 表示指向指针的指针,*** 表示指向指针的指针的指针。

指向指针的引用

引用本身不是对象,因此不能定义指向引用的指针。但是指针是对象,所以可以定义指针的引用。

int i = 42;
int *p;
int * &rp = p; //rp是一个对指针p的引用

rp = &i;	//rp是引用,因此给rp赋值&i就是让p指向i
*rp = 0; //解引用rp得到i,也就是将i的值修改为0
原文地址:https://www.cnblogs.com/xiaojianliu/p/12498700.html