C++易混变量类型

1. 指针引用和引用指针

1
2
3
4
int i= 42;
int *p;
int *&r = p; //正确,r是对指针p的引用,变量类型也是指针
int &*s = p; //错误,不可以生成引用类型的指针(因为引用不是变量)

要理解r的类型到底是什么,最简单的办法是从右向左阅读r的定义。离变量名最近的符号(此例中是&r的符号&)对变量的类型有最直接的影响,因此r是一个引用。声明符的其余部分用以确定r引用的类型是什么,此例中的符号*说明r引用的是一个指针。最后,声明的基本数据类型部分指出r引用的是一个int指针。
r是对int指针p的引用


2. 数组指针和指针数组

1
2
int* a[4];  //注意:[]优先级比较高,没有小括号时,a优先和[]结合,其次是*;
int (*b)[4];

类似上面第一个,两个变量同样从右向左阅读定义:

  • a附近没有(),它首先和[4]结合,指明a是一个容量是4的数组。然后左侧修饰符*号说明这个数组中元素的变量类型是指针,也就是说它是一个指针数组,最终这些指针的数据类型由int指明。所以,a是一个int类型的指针数组;
  • 由于有优先级更高的()的存在,b首先结合变成 (*b),这说明b是一个指针。其次右侧[4]说明该指针指向有4个元素的数组,这四个元素的类型由int表明。所以,b是指向存储着4个int类型元素的数组。

3. 指向函数的指针(函数指针)和返回指针的函数

每个函数都占用一段内存单元,他们有一个其实地址。指向函数入口地址的指针被称为函数指针。

一般形式:返回的数据类型 (*指针变量名)(形式参数表);
例如: int (*p) (int);

int (*p) (int);  //指向函数的指针,也即函数指针
int* p (int);   //返回指针类型的函数
int* processNum(int i, int j, int (*p) (int, int) );  //一个接收函数指针,并返回整型指针的函数

  1. const和指针、const和引用
    详见《修饰符const总结》