這個話題比較沉重揖盘,因為討論這個話題的小哥哥小姐姐們,基本屬于吃多了撐的锌奴。但是最還有有人喜歡討論兽狭,所有我也吃多了撐的來討論一下。
先看一段代碼:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
int a = 5;
int b = 50;
int *p;
p = &a;
int &q = a;
// 打勇故瘛:指針的地址箕慧,指針指向的地址,指向指向地址的值
qDebug() << &p << " : " << p << " : " << *p;
// 打榆钋 :引用的地址颠焦,引用的值
qDebug() << &q << " : " << q;
p = &b;
q = b; // 這次操作是的效果是:把b的值賦給a
qDebug() << &p << " : " << p << " : " << *p;
qDebug() << &q << " : " << q;
return app.exec();
}
運行輸出:
0x73fc80 : 0x73fc8c : 5
0x73fc8c : 5
0x73fc80 : 0x73fc88 : 50
0x73fc8c : 50
通過上面我們發(fā)現(xiàn)這么幾件事:
指針 | 引用 |
---|---|
可以先定義,再賦值 | 定義和賦值必須一起 |
定義必須是用”左值“ | 定義必須是用”左值“ |
定義后可以修改 | 定義后不能在修改 |
是一個對象往枣,有自己空間 | 是一個別名伐庭,不會被分配空間 |
(Ps:“左值”和“右值”的概念后面再說。)
到這里可以解釋一般的問題了分冈,但是事情的本質(zhì)并沒有被揭露圾另。
指針和引用的區(qū)別是在編譯時確定的:
程序在編譯時分別將指針和引用添加到符號表上:符號表上記錄的是變量名及變量所對應(yīng)地址,符號表生成后就不會改變雕沉。
指針變量在符號表上對應(yīng)的地址值為指針變量的地址值集乔,而引用在符號表上對應(yīng)的地址值為引用對象的地址值。
因此指針可以改變指向的對象坡椒,而引用對象不能改扰路。這是使用指針不安全而使用引用安全的主要原因。從某種意義上來說引用可以被認(rèn)為是不能改變的指針倔叼,因為引用的底層是用指針常量實現(xiàn)的汗唱。