學習c++的時候,我越來越感覺如果沒有真正學會引用和指標,那麼其他的部分就非常難以理解。因此,對於c++來說,引用和指標是絕對基礎而又重要的。
我們可以想象一下,對門王奶奶養了乙隻加菲貓,王奶奶給這只貓起名字叫「球球」。那麼,「球球」就是「王奶奶的加菲貓」這個物件的引用。由此引出了引用的定義:引用為物件起了另外乙個名字,通過將生命付寫成&d的形式來定義引用型別,其中d是宣告的變數名。
我們再想,對於王奶奶來說,「球球」這個名字已經給了她家的貓,不可能再管家裡的桌子、電視機叫「球球」,也就是說「球球」和那只貓是繫結在一起的。因此,「球球睡著了」就意味著那只貓睡著了,「球球醒了」就意味著那只貓醒了,「睡著」和「醒」都是那只貓的狀態,而不是「球球」這個詞的狀態。到這裡,我們其實也就知道了另外一點,單單「球球」這個詞是毫無意義的,「球球」必須和那只貓聯絡起來,「球球」這個詞才有意義。
所以,《c++ primer》總結了三點:
1. 定義引用時,程式把引用和它的初始值繫結在一起,而不是將初始值拷貝給引用。
2. 一旦初始化完成,引用將和它的初始值物件一直繫結在一起。
3. 因為無法令引用重新繫結到另外乙個物件,因此引用必須初始化。(這裡,我覺得是因為單單乙個別名沒有意義,所以引用必須初始化) 。
既然是自己家裡的貓,王奶奶一定會給家裡的貓下命令,比方說,「球球你不要亂咬東西」。雖然說王奶奶是叫「球球」不要亂咬東西,但實際上是叫那只貓不要亂咬東西,而不是「球球」這個詞不要亂咬東西。另外,王奶奶一定不會把「不要亂咬東西」起名叫「球球」。
由此,又能得到兩點:
1. 為引用賦值,實際上是把值賦給了與引用繫結的物件。獲取引用的值,實際上是獲取了與引用繫結的物件的值。同理,以引用作為初始值,實際上是以與引用繫結的物件作為初始值。
2. 引用只能繫結在物件上,而不能與字面值或某個表示式的計算結果繫結在一起。
指標相對於引用就不是那麼好理解。可以想象一下,tom住在賓館2048號房間,那麼這個2048號房間就是tom所在的位址。比方說lodger(房客)是乙個變數,lodger這時就是tom, 那麼&lodger這個操作就代表的是2048這個房間號。某一天,酒店說,我要加強酒店的管理,我得招聘乙個管理員,他可以隨意處置某個房間裡的一切,不用管房客同不同意。這個管理員就是指標。這一次,管理員pr_tom被分配到管理tom的房間,我們就會使用pr_lodger = &lodger這個語句來表示。*號用來解除指標,*pr_lodger就代表pr_lodger管理的房間號裡住著的人。由於房間管理員級別很高,他可以隨意處置房客,如果他認為peter應該住進2048號房間,也就是*pr_lodger = peter,那麼這塊地方tom就不能住了,房客也就變成了peter。也就是說,lodger這個變數的值現在是peter。
上面說的是正常的情況,也就是說管理員只是對普通房客行使自己的權利,一切都還好說,但是問題在於這個管理員的權力太大,而且比較死腦筋,如果因為某種失誤導致管理員指向了重要客戶的房間甚至酒店管理層的房間,管理員再隨意行使權力,那麼後果就是不堪設想的。因此使用指標這個管理員的時候必須要小心。在管理員沒什麼事做的時候,一定要告訴他你**都不要指(nullptr)。
到了這裡,我覺得可以先總結一下:
1. 指標本身就是乙個物件,允許對指標賦值和拷貝,而且在指標的生命週期內它可以先後指向幾個不同的物件。
2. 指標無須在定義時賦初值,如果沒有初始化,將擁有乙個不確定的值。
3. 獲取某物件位址使用取位址符(&)。
4. 指標的值有四種:(指向乙個物件、指向緊鄰物件所佔空間的下一位置、空指標、無效指標)。
5. 如果指標指向了乙個物件(⚠️一定要確保這一點),允許使用解引用符(*)來訪問該物件。
6. 可以使用null或者0代表空指標,c++11 以後可以使用nullptr,我更傾向於使用nullptr。
7. ⚠️一定要確保指標的使用是合法的,也就是說,指標最好在使用之前初始化為空指標,並且在使用過程中隨時注意指標的使用狀況,多對指標加以限制(最典型的,const)。
void*指標的特點
1. 可用於存放任意物件的位址。
2. 我們對該位址中到底是什麼型別的物件並不了解。
3. 不能直接操作void*指標所指的物件,因為我們並不知道這個物件到底是什麼型別,也就無法確定能在這個物件上做那些操作。
void*指標的用途
1. 拿它和別的指標比較。
2. 作為函式的輸入或輸出。
3. 賦給另外乙個void*指標。
C Primer註解之引用和指標
引用 reference 引用 指的是左值引用 lvalue reference 引用 取小名,達到繫結物件的作用,而不是將初始值拷貝給xnxioxbtwa引用 special 不能和 字面值 和 計算結果 繫結 引用不是物件 對引用的操作,都是在與之繫結的物件上進行的 除了兩種例外外,引用的型別 ...
C Primer 引用 指標 常量
定義引用時,程式把引用和它的初始值繫結在一起,而不是把初始值拷貝給引用。一旦初始化完成,引用將和它的初始值物件一直繫結在一起,因此無法讓引用繫結另乙個物件,所以引用必須初始化。所有引用的型別都必須要和與之繫結的物件嚴格匹配,而且引用只能繫結在物件上,而不能和字面值或表示式的結果繫結在一起,以下兩種情...
C Primer 筆記 指標和引用的區
區別 1.引用總是指向某個物件 定義引用時必須初始化。2.對引用的修改實際是對其關聯的物件進行修改。如下兩個程式段 int ival 1024,ival2 2048 int pi ival,pi2 ival2 pi pi2 pi now point to ival2賦值結束後,原pi所指的ival物...