窺探引用和指針

C語言面試題裏面經常會出現一道題目:向某個指定的內存地址寫入特定的數據,譬如向0x1234寫入100,做法如下*(int *)0x1234=100;解釋一下就是將0x1234利用(int *)強制轉換爲地址,並使用*這把鑰匙打開這塊內存,寫入數據100,既然如此,可不可以根據這個原理寫如下代碼:int b=10;int &a=b;關鍵在第二條語句,創建變量a的同時利用&符號取得a的地址並向裏面寫入10,自以爲這樣理解是對的,編譯通過,在運行的時候打印a的數值也能得到a=10這樣正確的答案,但仔細一想有大問題,int a=b;這條語句將b作爲右值,a作爲左值,作爲右值自然是代表具體的數據,但是左值本身也代表地址,這樣看來int &a=b;豈不是多此一舉,於是打印了a和b的地址,發現&a和&b竟然一樣,也就是指向同一片地址,滿懷這不解上網查證,發現int &a=b;這句代碼引出C++(引用是C++中的概念)語言的一個重要的概念‘引用’,引用和指針類似,但是又有區別下面一一列出:
 相同點:
    1. 都是地址的概念;
    指針指向一塊內存,它的內容是所指內存的地址;引用是某塊內存的別名。
    ★ 區別:
    1. 指針是一個實體,而引用僅是個別名;
    2. 引用使用時無需解引用(*),指針需要解引用;
    3. 引用只能在定義時被初始化一次,之後不可變;指針可變;
    引用“從一而終” ^_^
    4. 引用沒有 const,指針有 const,const 的指針不可變;
    5. 引用不能爲空,指針可以爲空;
    6. “sizeof 引用”得到的是所指向的變量(對象)的大小,而“sizeof 指針”得到的是指針本身(所指向的變量或對象的地址)的大小;
    typeid(T) == typeid(T&) 恆爲真,sizeof(T) == sizeof(T&) 恆爲真,但是當引用作爲成員時,其佔用空間與指針相同(沒找到標準的規定)。
    7. 指針和引用的自增(++)運算意義不一樣;
畢竟之前沒用過,只是分享經驗,對於引用卻是很少接觸,所以不敢在多說,寫下這些只是提醒自己保持清醒。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章