c語言 解引用

2021-09-06 10:33:29 字數 1668 閱讀 3132

最近接觸到了乙個新的概念,叫「解引用」。就是在函式傳參時,如果傳入的是指標,在函式體中未對它解引用,那麼,這個指標指向的值就不會發生改變。

引用別人部落格中的概念:

參考這三篇部落格,感謝他們。

首先,我們來看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 中還有乙個名字就是 解引用 他的意思就是解釋引用,說的通俗一點就是,直接去尋找指標所指的位址裡面的內容,此內容可以是任何資料型別,當然也可以是指標 這就是雙重指標,後面將會討論 需要注意的是,在變數宣告的時...