2018-05-09
《c++反彙編和逆向技術》第八章 陣列和指標的定址 讀書筆記
雖然陣列和指標都是針對位址操作,但它們有許多不同之處。陣列是相同資料型別的資料集合,以線性方式連續儲存在記憶體中;而指標只是乙個儲存位址值的4位元組變數。在使用中,陣列名是乙個位址常量值,儲存陣列首元素位址,不可修改,只能以此為基位址訪問記憶體資料;而指標卻是乙個變數,只要修改指標中所儲存的位址資料,就可以隨意訪問,不受約束。
1. 陣列在函式內
對於陣列的識別,應判斷資料在記憶體中,是否連續並且型別是否一致,均符合即可將此段資料視為陣列。
2. 陣列作為引數
當陣列作為函式形參時,函式引數中儲存的是陣列的首位址,是乙個指標變數,叫陣列指標。
雖然引數是指標變數,但需要特別注意的是,實參陣列名為常量值,而指標或形引數組為變數。使用sizeof(陣列名)可以獲得陣列的總大小,而對指標或者形參中儲存的陣列名使用sizeof只能得到當前平台的指標長度。
3. 陣列作為返回值
當返回陣列為區域性變數資料時,就產生了穩定性問題。因為區域性變數已釋放。
區域性靜態陣列有多少元素,也只會檢查一次初始化標誌位。
4. 下標定址和指標定址
訪問陣列的兩種方式:下標定址(「陣列[下標]」)和指標定址。
指標定址的方式不但沒有下標定址的方式便利,而且效率也比下標定址低。由於指標是存放位址資料的變數型別,因此在資料訪問的過程中需要先取出指標變數中的資料,然後再針對此資料進行位址偏移計算,從而定址到目標資料。陣列名本身就是常量位址,可直接針對陣列名所代替的位址值進行偏移計算。
ary[n]的位址 = ary的首位址 + sizeof(type)*n
5. 多維陣列
6. 存放指標型別資料的陣列
顧名思義,存放指標型別資料的陣列就是陣列中各資料元素都是由相同型別的指標組成,我們稱之為指標陣列,其語法為:
型別名* 陣列名稱 [元素個數];
char* pbuff[3] = //字串指標陣列定義
char carray[3][10] = ,,}; //二維陣列定義
字元指標陣列定址後,得到的是陣列成員內容(指標變數值即字串位址),而二維陣列定址後得到的卻是陣列中某個一維陣列的首位址。
7. 指向陣列的指標變數(陣列指標)
語法:型別名 (*指標變數名稱) [一維陣列大小]
8. 函式指標
語法:返回值型別 ([呼叫約定,可選] *函式指標變數名稱) (引數資訊)
注意:陣列指標和函式指標都只是指標變數,(*指標變數名)是為了解釋指標變數指向位址的結構。比如int* ptr,表示ptr指向位址儲存了乙個int型別變數。但是由於陣列自身元素也有型別,函式位址也有返回值,都需要宣告。所以,最前面的型別位置就不變了,用(*指標變數名)表示指標所指位址的結構。功能跟int*一樣。
python第9天數值日期處理
一 處理異常try x 5 0 print x except zerodivisionerror print 不能除以0 except print 其他錯誤 else print 沒有異常 二 測試 import unittest 匯入python自帶的測試模組,單元測試 from yichang ...
第 章 陣列和指標
第 章 陣列和指標 現代c 程式應使用vector和迭代器代替陣列和指標,除非前二者不滿足對效率的特殊要求 陣列 陣列是由型別說明符 識別符號和維度組成的復合型別,能儲存一組某種型別的未命名物件 定義和初始化 型別說明符規定了存放於陣列中元素的型別 可使用除引用外的任意型別,包括陣列本身 陣列的陣列...
第4章陣列和指標
陣列的定義和初始化 注意 1.顯示初始化陣列元素 在函式體外定義的內建陣列,其元素均初始化為0 在函式體內定義的內建陣列,其元素無初始化 不管陣列在 定義,如果其元素為類型別,則自動呼叫該類的預設建構函式進行初始化,如果該類沒有預設建構函式,則必須為該陣列的元素提供顯式的初始化。2.特殊的字元陣列 ...