1.異同點
引用與指針都是複合類型(compound type),建立在已存在類型的基礎上
引用是對對象的綁定,是對象的別名,並不是具體的對象;指針指向某一對象,指針本身就是一個對象
引用在定義時必須初始化,且只能綁定一個對象不能修改;指針在定義時不要求初始化,且指針可以更改指向的對象
2.初始化
引用的初始化:
int a = 3;
int &ra = a;
++ra; //a=4
指針的初始化:
int b = 4;
int *pb = &b;
指針初始化爲空:int *p1 = 0;
int *p2 = nullstr;
int *p3 = NULL;//#include <cstdlib>
注意:用字面值0初始化指針,下面兩種情況:
int i = 0;
const int j = 0;
int *pa = i; //error
int *pb = j; //ok
3.關於引用的引用,指向指針的指針,指向引用的指針和指針的引用
引用的引用:因爲引用本身不是一個具體的對象,因此不存在對引用的引用
int i = 1;
int &ri = i;
int &rii = ri; //ok
int& &riii = ri; //error
引用的引用:首先是個引用,然後引用的對象是引用,所以分析 int& &riii = ri; 左側按 照從右到左分析&rii是個引用,int&引用的對象是個int類型的引用
指針的指針:指針本身是個對象,因此可以定義指向指針的指針
int x = 0;
int *px = &x;
int **pxx = &px;
cout << x << " " << *px << " " << **pxx << endl;
cout << &x << " " << px << endl;
cout << &px << " " << pxx << endl;
指向引用的指針:同引用的引用一樣,顯然指向引用的指針是不存在的
int& *p = &ra;
指針的引用:
int a = 1;
int *pa = &a;
int* &rpa = pa;
cout << pa << " " << rpa << endl;
cout << *pa << " " << *rpa << endl;
*rpa = 2;
cout << a << endl;
注意:對於比較複雜的變量的定義,在賦值運算符左側按照從右到左的分析方法是比較清晰的
4.關於void*
void*指針可以存放任意數據類型的地址,其他類型的指針只能指向與其類型相同的對象