指標與引用的差別:
1.非空區別。在任何情況下,都不能使用指向空值的引用。
2.合法性區別。在使用引用之前不需要測試它的合法性,指標則應該總是被測試,防止其為空。
3.可修改區別。指標可以被重新賦值以指向另乙個不同的物件,而引用則只能指向初始化時被指定的物件。
4.可計算區別。指標可以進行加減運算,引用則不行。
例題1
這個函式有什麼問題,該如何修改?
char *stra()
分析:「hello word"儲存在堆疊中,為區域性變數,函式呼叫完成時會被釋放,存放」hello world「的空間不應再被訪問。可修改為:
const char *stra()
char c = "hello world"是分配乙個區域性陣列,而char *c = "hello world"是分配乙個全域性陣列。區域性陣列是區域性變數,它對應記憶體中的棧。全域性陣列是全域性變數,它對應記憶體中的全域性區域。
char * c = "hello world",字串在靜態儲存區,不可以通過c[0]='a'來修改。
char c= "hello world",可以通過c[0]='a'來修改。
上述**也可以換成:
const char *stra()
例題2
請問下面**的輸出結果是多少?
分析:首先要先判斷p->fun()呼叫的是哪個類中的函式,根據指標型別,它呼叫的應該是b類中的函式,但是p所指向的記憶體空間中
並沒有變數c。事實上,編譯器對c的認識就是變數c相對於物件的首位址的偏移量,而c的偏移量為0,因此會列印出偏移a首位址為0的
資料。
答案:1(a的值)
例題3
下面程式會在哪一行崩潰?
s.p[1]=1將s.p的值修改為1,因此s.p[0]=2,相當於*((int * )1) = 2;也就是要訪問0x00000001空間,對乙個未做宣告的位址空間進行訪問,會出現訪問出錯。測試**如下:
答案:s.p[0] = 2 崩潰。
指標與引用
摘自 高質量c 程式設計 指標與引用,在more effective c 的條款一有詳細講述,我給你轉過來 條款一 指標與引用的區別 指標與引用看上去完全不同 指標用操作符 和 引用使用操作符 但是它們似乎有相同的功能。指標與引用都是讓你間接引用其他物件。你如何決定在什麼時候使用指標,在什麼時候使用...
引用與指標
引用就是物件的另乙個名字,在實際的程式中,引用主要用作函式的形式引數。引用是一種復合型別,通過在變數名前新增 符號來定義。復合型別是指用其他型別定義的型別。在引用的情況下,每一種引用型別都 關聯到 某一其他型別。引用必須用與該引用同型別的物件初始化。當引用初始化後,只要該引用存在,它就保持繫結到初始...
指標與引用
include iostream using namespace std void testref int i 10 引用不可以為空,他是乙個物件的別名 int ref i ref cout i 00824f1e mov dword ptr i 1 把i的位址傳入eax 並把eax指標的位址傳給re...