乙個簡單的方法理解C 中的指標

2021-10-02 13:37:34 字數 1591 閱讀 4023

乙個陣列的名稱,就是第乙個元素的位址,實際上可以看成乙個指向陣列第乙個元素的指標,而陣列名加上[num],則代表陣列第num個元素的內容,可以等價為陣列名前加*(讀作間接值符號會有助於理解)。舉個例子:

int a[5]

;int

* b = a;

cout << a << endl;

cout << b << endl;

cout << a[0]

<< endl;

cout <<

*b << endl;

執行上面的**片段,我們可以得到兩組相同的結果,因此,在面對陣列和指標時,我們不妨把與*等效。那麼對於指向指標的指標等更複雜的情況如何搞清楚關係呢,我認為可以使用畫方框的辦法。

先舉乙個簡單的例子:

int

* a;

int*

* b;

方框圖用方框表示儲存單元,箭頭表示指向關係。第一行**可以用方框圖表示為:

第二行**可以用方框圖表示為:

舉個更複雜的例子mixtypes.cpp(來自c++primerplus第六版):

#include

using

namespace std;

struct antarctica_years_end

;int

main()

;

cout << arp[1]

-> year << endl;

const antarctica_years_end *

* ppa = arp;

auto ppb = arp;

cout <<

(*ppa)

-> year << endl;

cout <<(*

*(ppb+1)

).year << endl;

return0;

}

const antarctica_years_end * arp[3]

=;

這句**,定義了乙個指標陣列,陣列中的每個元素都是乙個指標,指向乙個antarctica_years_end結構型別的變數,那麼我們可以根據這個關係畫(對於arp)出如下方框圖:

第乙個儲存單元名字為arp,第二個儲存單元是arp陣列中第乙個元素(指標),該元素指向乙個antarctica_years_end結構型別的值。這樣我們也就不難理解下面這句**:

const antarctica_years_end *

* ppa = arp;

這裡是建立乙個指向antarctica_years_end指標型別的指標,化成方框圖我們可以很清楚的看出實際上名稱為ppa和arp的兩個儲存單元中儲存了相同的乙個位址,這個位址都指向arp陣列的第乙個元素。

cout <<

(*ppa)

-> year << endl;

cout <<(*

*(ppb+1)

).year << endl;

將與等效,每乙個其實就是方框圖向箭頭方向前進乙個方框即可。

乙個簡單的C 智慧型指標的實現

c 在堆上分配的記憶體需要分配者自己釋放,但是有時分配者由於某種情況忘記釋放,此時會造成記憶體洩漏,因此實現了乙個簡單的智慧型指標。引用計數類,負責管理動態分配的記憶體的使用者數量 class reference reference 自增 int add 自減 int release private...

C 乙個簡單的方法過載例子

定義calculate類 class calculate 方法過載 求兩實數之商 static public double divide double x,double y 這裡定義了兩個名稱同為divide 的方法,它們的方法名稱完全相同,但引數型別不同,這種方式稱為方法過載。那麼遇到語句 div...

乙個簡單的日誌方法

file g filelog null void loginit bool writelog lpctstr format,int res tcsftime outbuf,128,t 20 y年 m月 d日 h m s localtime tm tchar lpszinfobuf 1024 va l...