關於指針和引用

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*指針可以存放任意數據類型的地址,其他類型的指針只能指向與其類型相同的對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章