C語言學習第二階段整理複習 陣列

2021-09-10 07:33:36 字數 2967 閱讀 6734

二維陣列

什麼是陣列?陣列是一組具有相同資料型別的變數的集合體, 其儲存的位置緊挨在一起,是連續的。

我把陣列聯想為乙個大的階梯教室,按照椅子背上面的座位號順序排列的座位

椅背上沒有編號,可以和自己本校的帶有編號的椅子進行配對,也可以將圖中的椅子按照順序進行編號即可。每個椅子可以坐下乙個人(相當於可以存放相同資料型別的記憶體單元),椅背的編號就是記憶體單元所對應的陣列下標。

形如:

資料型別 變數名[常量表示式]

的定義形式,即為一維陣列。其內存放的是具有相同資料型別的變數的個數。

寫個**測試一下:

void

initarr

(int arr,

int len)

}void

printarr

(int arr,

int len)

printf

("\n");

}#define arrsize(a) sizeof(a) / sizeof(a[0])

intmain

(int argc,

char

* ar**)

;initarr

(arr,

arrsize

(arr));

printarr

(arr,

arrsize

(arr));

return0;

}

debug版本扔到ollydbg中進行檢視:

預設採用的是__cdecl呼叫約定,呼叫者負責清理堆疊,引數入棧順序為從右到左,故可以寫出其呼叫函式的形式:

ebp== 0x0012ff80h

所以lea eax, [ebp - 190]==0x0012fdf0h

initarr(0x0012fdf0h, 0x64);

到堆疊視窗檢視是否符合我的邏輯推理:

在執行完畢for迴圈後,看列印出來的結果是不是和其儲存在記憶體的資料是一樣的。按照低位址優先原則,在0012fdf0處存的資料應該是0x0000000fh,轉換成10進製資料為15

輸出結果:

故實驗結果與所想一致。

陣列名的本質是常量指標。

把陣列名理解為記憶體單元的別名(相當於階梯教室的門牌號),代表的是這塊連續記憶體單元的首單元的位址,通過這個別名,可以直接讀取相應的記憶體單元或者寫入相應的記憶體單元。而陣列下標是階梯教室的座椅的座位號。通過陣列名 + 陣列下標可以唯一確定乙個記憶體單元。

我個人的理解是,通過陣列名[常量表示式]所在位置(在賦值號的左側還是右側)來確定是讀取相應的記憶體單元資料還是寫入相應的記憶體單元的資料,而不代表其所在的記憶體單元的位址。

模擬於學生的學生名和學生的學號。通過學生名可以唯一找到這名學生(在現實生活中可能會重名,但是在c程式的編譯階段會保證變數簽名是唯一的),可以讀取這名學生的其他資訊,也可以修改其相應的一些資訊,但是不代表其學生號。因此,資料名[下標]僅僅是其別名,而不代表該記憶體單元的位址。

可以利用#define進行計算

#define arrsize(a) sizeof(a)/sizeof(a[0])
而如果用資料做函式的引數的話,它就會退化為一級指標,不能通過該定義進行求解陣列的資料個數。

在上述例子中,也驗證了這點,看initarr(int arr, int len)的反彙編

其採用的是lea eax, dword ptr ss:[ebp - 190]push eax的形式,給函式initarr傳遞所需的引數,對於引數int arr,其傳遞的是陣列記憶體所在的記憶體單元的首位址,而不是將整塊記憶體拷貝過去,因此當陣列名作為函式引數傳遞時,退化為指標。

綜上,當陣列名作為函式引數傳遞時,不能直接計算其資料個數。

int a[10]- 定義乙個資料型別為int型的陣列。

注意:

int a[10]

=;a +1

;// 結果為多少?

&a +1;

// 結果為多少?

在這裡,如果不帶&的話,是加的sizeof(type(a));如果帶&的話,是加的sizeof(type(&a))。(在這裡的type是我自己定義的函式,即變數所對應的資料型別)

二維陣列就簡單多了,是一維陣列的擴充套件。不過在遍歷二維陣列的時候,要根據資料量的大小,來採用變數方式(行優先遍歷或者列優先遍歷)

如果資料量過大的話,採用列優先變數違背了區域性性原理,可能會頻繁的產生缺頁中斷,進行資料的換入換出,影響效率。

第二階段 有關API 複習

一些陷阱 注意點 1 string s 123 string c 123 這時候的引用物件指向同乙個位址。所以 s.equals c 和 s c 的結果都是true 正確的 原因 equals的比較法是比較兩個物件的內容是否相同,均為123 正確 雙等號比較的是是否指向同個位址,s在初始化的時候往池...

第二階段小結

資料結構基本概念 資料 資料即資訊的載體,是能夠輸入到計算機中並且能被計算機識別,儲存和處理的符號總稱 資料元素 資料元素是資料的基本單位,又稱之為記錄。一般,資料元素由若干基本項 字段,域,屬性 組成。資料結構 資料結構指的是資料元素及資料元素之間的相互關係,或組織資料的形式 資料之間的結構關係 ...

第二階段小結

先是pta上的作業 這題要求我們熟練的掌握類之間的繼承與多型的使用,在類與類之間傳遞資訊時不能弄混,要弄清楚單一職責原則。這一題主要考察繼承與多型,泛型容器的應用。接下來是學習通上的課後作業 第乙個是單向鍊錶 單向鍊錶由乙個個的節點組成,這些節點都帶有下乙個節點的引用,最後乙個節點指向null,這樣...