最近接觸到了乙個新的概念,叫「解引用」。就是在函式傳參時,如果傳入的是指標,在函式體中未對它解引用,那麼,這個指標指向的值就不會發生改變。
引用別人部落格中的概念:
參考這三篇部落格,感謝他們。
首先,我們來看swap的常見錯誤用法。
void
swap
(int
*p1,
int*p2)
void
swap_err1
(int a,
int b)
//未傳遞位址
void
swap_err2
(int
*p1,
int*p2)
//未解引用
void
swap_err3
(int
*p1,
int*p2)
//指標未初始化
intmain()
執行結果:
分析:第一種swap是正確的用法。
swap_err1,也是最常見的錯誤用法,沒有傳入指標,是值傳遞,不會改變主函式中a和b的值。
void
swap_err1
(int a,
int b)
//未傳遞位址
swap_err2,其實就是沒有解引用,雖然傳入的是a和b的位址,但是沒有對相應的位址進行操作,也就是未解引用,所以,這個函式的就是把a和b的位址賦值給p1p2,p1p2的位址進行了交換,函式結束,p1p2釋放,對值函式的ab值也沒產生影響。
void
swap_err2
(int
*p1,
int*p2)
//未解引用
swap_err3,用到的指標傳遞,也解引用了,主要問題就是tmp指標變數未初始化,*tmp的值就是不確定的,也會導致程式出錯。
void
swap_err3
(int
*p1,
int*p2)
//指標未初始化
在以前我的部落格中也用到了申請記憶體。
再看一段程式:
#include
#include
void
get(
int*
*p,int n)
else
}void
get_err
(int
*p,int n)
else
}int
main()
get_err執行結果:
分析:這裡錯誤的原因其實也就是沒有解引用,把指標p的位址賦值給函式的p,注意,並不是將p指向的內容的位址賦值給p,導致申請記憶體失敗。也可以這樣理解,指標傳遞,其實也用的是值傳遞,傳遞的是指標的位址,要想在函式中影響函式外的值,需要對指標指向的位址進行操作,也就是用*p = 5(取內容)操作。
get執行結果:
這兒就是正確的用法,一般申請記憶體,用函式的話,需要用到二級指標,如果在主函式內部的話,直接申請就可以。
C語言 多級指標 解引用
1.解引用 int main int a 10 int b 20 printf d d n a,b 10 20 int p a p裡儲存a的位址 p 100 對p解引用,將p指向的位址的內容賦為100 p b p指向b p 200 將p指向的位址的內容賦為200 printf d d n a,b 1...
C語言 指標pointer 與解引用
符號 的三種概念 a a b 乘法 兩邊都是變數 乘法概念 int p 識別符號 和 變數之間 申明概念 申明了乙個指標p p 100 指向概念 指標有三個值,最關係其中兩個值 p和 p p 指標p,存放的是a的位址 指向目標的位址 p p指向目標的內容 不常用 p 存放的也是位址,是指標的位址 理...
關於C中指標的引用,解引用與脫去解引用
在指標操作中的意義 1 大家都知道在寫int p 時,可以宣告乙個指標。很少人知道 在c c 中還有乙個名字就是 解引用 他的意思就是解釋引用,說的通俗一點就是,直接去尋找指標所指的位址裡面的內容,此內容可以是任何資料型別,當然也可以是指標 這就是雙重指標,後面將會討論 需要注意的是,在變數宣告的時...