Delphi 小談之TList 篇
最近開發程式需要使用TList功能,轉載此文章,以作參考。
看了這裡標題,大家可能以為我會談TListBox控制元件,那就錯了。我要談的是Delphi提供給我們的具有列表性質的類:TstringList、TList和TObjectList。TstringList用來存放字串,TList存放指標,而TObjectList則存放物件(Object)。
在我們使用Delphi 的過程中,有很多資料的儲存是要靠陣列解決的。雖然Delphi現在已經支援了可變陣列,不過總有那麼點缺陷:我們不能在刪除一個項後,使後邊的項自動前靠。因此,說說Delphi現成的List還是有價值的。
TstringList (Classes.pas)
在TstringList裡,那些String被一行一行地儲存。TstringList.Text返回全部的String。如果第一、二、三行分別是/'aa/'、/'bb/'、/'cc/' 的話,那麼Text 返回的是“/'aa/'+#13#10+/'bb/'+#13#10+/'cc/'+#13#10” (不包括雙引號)。所有的String都被TstringList用回車和換行符(#13#10)連線了起來。如果依次向Text賦值的話,Text就會被自動地分割成行儲存在TstringList 裡。這充分地體現出TstringList的一個很實用的價值:它能讓我們逐行處理String。假如我們要操作第4行,只需操作TstringList[3]。相信大家會問,TstringList明明是一個類,為什麼能當陣列那樣子用呢?其實,我們在寫TstringList[3]的時候,就是在寫TstringList.Strings[3]。Strings是TstringList的一個預設屬性。陣列性的預設屬性就是這樣子使用的。如果大家在編寫類的時候要用到這麼一個功能的話,可以參照如下方法:
property AProperty[I: Integer] read *** write ***;
default;。
Strings 是一個可讀寫的屬性。這也就是說,大家不僅可以獲得第N 行的內容,也可以改變第N 行的內容。因此我們需要知道TstringList 裡S t r i n g 的總行數。TstringList的屬性Count則可以滿足我們的需要。
上面已經說過,Text是一個返回所有字串的屬性。向Text賦值時,TstringList能夠自動地把Text分成一行一行的,然後儲存在TstringList裡(當然,TstringList裡面並不完全是這麼儲存的,詳細過程建議看TstringList和TStrings的程式碼)。這樣,Strings返回的字串就是沒
有回車和換行的。但是,如果我們向Strings賦值的字串有回車和換行,那麼會出現什麼情況呢?此時,Strings就會把那個字串斷成幾行,插入到原來的位置上。如果TstringList只有這麼些功能的話,那我就不必專門拿出來講了——我是說,TstringList能讓我們任意
地插入或刪除某行,這就要用到TstringList提供的方法。
function Add(const S: string): Integer;
procedure Append(const S: string);
Add方法向TstringList的末尾新增一行String(在這裡和下面我們都假設輸入的字串沒有回車和換行,否則String將被分割)。引數S 代表的是要插入的字串的內容。Add的返回值代表了新的字串在TstringList的位置——也就是最後一行的位置,即新的Count 減去一。
Append 方法與Add 唯一不同的地方是沒有返回值。
procedure Insert(Index: Integer; const S: string);
Insert方法向TstringList插入一行字串。在Insert裡,我們可以自由地選擇字串插入的位置。引數S 代表要插入的字串的內容,Index 代表要插入的位置。
procedure Delete(Index: Integer);
Delete 方法刪除某行字串,我們同樣可以自由地選擇刪除任意一行字串。引數Index代表要刪除的那一行字串的位置。學習筆記
function IndexOf(const S: string): Integer;
IndexOf查詢某一字串在TstringList裡的位置。引數S代表要查詢的字串。如果TstringList裡不存在S的話,則返回-1。
procedure Move(CurIndex, NewIndex: Integer);
procedure Exchange(Index1, Index2: Integer);
TstringList另外還提供了兩個方法—— Move 和Exchange。Move方法能把一行字串抽出來並插入到另一個指定的位置上。引數CurIndex代表要移動的字串的位置,NewIndex 代表字串新的位置。
Exchange方法則能將隨便兩行字串交換。引數Index1和Index2代表兩行需要交換的字串的位置。
procedure LoadFromFile(const FileName: string);
procedure SaveToFile(const FileName: string);
TstringList的LoadFromFile和SaveToFile兩個方法,使得我們對文字檔案的操作變得非常方便。引數FileName 代表目標文字檔案的檔名。例如我們在編寫記事本的時候,用到的TMemo.Lines 就是TStrings(TstringList的父類,功能幾乎相同,只是因為TStrings是虛類,我們無法建立並使用)。在儲存的時候只需一行程式碼:TMemo.Lines.SaveToFile(FileName),非常方便。
TstringList還有一項特殊功能:可以把TstringList當成ini控制器使用。不過它沒有Section。現在我就來介紹TstringList的兩個屬性:Names和Values。
如果TstringList的內容是這樣子的:
ID=1
Name=Vczh
PositionID=8
Tel=00000000
那麼,Names[2]就返回“PositionID ”,Values[/'PositionID/']就返回“8”。其中“Names”是隻讀屬性,而“Value”則可寫。TstringList使我們不必拘泥於ini和登錄檔。關於TstringList沒有Section這個問題,我們完全可以在Names 裡做點手腳,只要程式能夠識別就行(文
章末尾處的範例裡將出現此方法供大家參照)。
TstringList還有一個可以存放Object的功能。但是我個人認為使用TObjectList比較好,因為TObjectList在這方面提供了比TstringList更多的功能。
下面我提供一個例程來介紹Values屬性。
新建一個工程儲存,並在dpr檔案所在的資料夾裡建立一個叫做“Config.txt”的檔案,並輸入以下內容:
Name=VCZH
Address=Somewhere
然後,建立一個窗體。如圖所示:並在TForm1 的Private 區段裡建立一個變數:
SL:TstringList;
這個例程的功能是編輯Config.txt 裡的Name 、Address、Email。SL在程式啟動時讀入Config.txt檔案;按下Cancel 按鈕則退出;按下OK 按鈕則改變SL 的內容並儲存在Config.txt檔案裡;當程式再次執行時,改變後的內容就會顯示在三個文字框裡。程式碼如下:
procedure TForm1.FormCreate(Sender: TObject);
begin
SL:=TstringList.Create;
{ 獲取當前程式檔案所在的資料夾名稱以獲得C o n f i g . t x t 檔案的路徑 }
SL.LoadFromFile(ExtractFilePath(ParamStr(0))+/'Config.
txt/');
end;
procedure TForm1.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
SL.Free;
end;
procedure TForm1.btnCancelClick(Sender: TObject);
begin
Close;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
{ 通過上面介紹的V a l u e s 屬性獲得各個欄位的內容 }
edtName.Text:=SL.Values[/'Name/'];
edtAddress.Text:=SL.Values[/'Address/'];
edtEmail.Text:=SL.Values[/'Email/'];
end;
procedure TForm1.btnOKClick(Sender: TObject);
begin
{ 修改各個欄位的內容並儲存 }
SL.Values[/'Name/']:=edtName.Text;
SL.Values[/'Address/']:=edtAddress.Text;
SL.Values[/'Email/']:=edtEmail.Text;
SL.SaveToFile(ExtractFilePath(ParamStr(0))+/'Config.
txt/');
Close;
end;
程式執行後如圖:
-------------------------------------------------------------------------------------
Tlist (Classes.pas)
在我剛開始接觸TList的時候,TList搞得我迷霧重重,都是Capacity屬性惹的禍。我查了Delphi的幫助,它說Capacity是TList的最大容量,又在什麼地方說MaxIntdiv 4是TList的最大容量。最後我搞明白了,Capacity是臨時的,MaxInt div 4才是真正的最大容量。只要你的內
存受得了就行,算起來一共是4G。在TList 內部有一個FList指標指向一個Pointer陣列,Capacity就是這個陣列的大小。奇怪的是Capacity是可寫的。我當時就在想,如果一直使用Add 直到超出了Capacity的範圍,會怎麼樣呢?為了解決這個問題,我特地打開了TList 的程式碼,結果發現如下幾行(註釋是我自己加的):
function TList.Add(Item: Pointer): Integer;
begin
{ 返回Item 所在的位置 }
Result := FCount;
{ 如果FList 數祖被填滿了裝不下新的Item
那麼TList 自動增加Capacity
也就是FList 指向的陣列的大小 }
if Result = FCapacity then
Grow;
{ 擴大了FList 的大小後,就能把 Item 放進陣列了 }
FList^[Result] := Item;
Inc(FCount);
if Item <> nil then
Notify(Item, lnAdded);
{ 給TList 一個訊號,通知TList 已經加上了一個新的Item }
end;
procedure TList.Grow;
var
Delta: Integer;
begin
{ 增加的規則是,如果數量小於或等於8,那麼增加4 ;如果數量在8 之上,小於或等於64 ,那麼增加16 ;如果數量比64 還大,那麼一次增加大約1/4 的空間 }
if FCapacity > 64 then
Delta := FCapacity div 4
else
if FCapacity > 8 then
Delta := 16
else
Delta := 4;
{ 改變陣列大小 }
SetCapacity(FCapacity + Delta);
end;
既然Capacity會自動增加,那麼還要Capacity幹什麼呢?還不如使用連結串列。不過我後來意識到,在使用連結串列的時候,取得某個位置的指標比陣列困難,要用比較費時間的迴圈。TList剛好解決了這個問題。我們既可以把TList 當成陣列,也可以把它當成連結串列。
TList 除了儲存的物件是指標以外,其它地方都與TstringList很像。所以接下來我只介紹二者不同之處。
我們同樣可以使用TList或者TList.Items獲得某一位置的指標。如果嫌TList.Items是屬性沒有效率的話,這裡還有一個List屬性,指向內部的FList,可以這麼用:
TList.List^。
TList提供了First和Last兩個屬性,分別返回第一個和最後一個指標。
TList 也提供了一個Remove方法。與Delete不同的是,Delete刪除的是已知位置的指標,Remove刪除的是已知指標。只要TList 包含有你想刪除的指標,就可以使用Remove(Pointer)。Remove的返回值是指標在還沒有被刪除之前的位置。使用方法如下:
procedure Delete(Index: Integer);
function Remove(Item: Pointer): Integer;
TList還有一個Pack方法。它能夠把所有不是nil的指標聚在一起,同時把Count 的值改變,這樣,所有沒用的指標就會被刪除,但是並不會減少Capacity。如果你想把沒用的空間都釋放掉的話,可以把Capacity設定成Count。
最後,我想說的是Protected裡的Notify。大家在Add的程式碼裡就能看到,在Insert、Delete之類的程式碼裡我們也能看得到Notify的蹤跡。既然FList的內容已經被改變了,Notify 還要做什麼工作呢?看一下Notify的程式碼:學習筆記
TListNotification = (lnAdded, lnExtracted, lnDeleted);
procedure TList.Notify(Ptr: Pointer; Action:
TListNotification);
begin
end;
留著一個空的Notify 有什麼用呢?再看它的宣告:
procedure Notify(Ptr: Pointer; Action: TListNotification);
virtual;
原來Notify 是一個虛擬函式,當我們因為有特殊要求而繼承TList類的話,只要TList 的內容一改變,我們就能得到通知。不過前提是我們要覆蓋N o t i f y 這個
Procedure。
-------------------------------------------------------------------------------------
TObjectList (Contnrs.pas)
T O b j e c t L i s t 中有一個不可缺少的屬性:OwnsObjects。如果OwnsObjects是True(預設值)的話,那麼TObjectList會在適當的時候把它列表中的Object釋放掉。
現在,讓我們用一個例子來結束我對Delphi的List的介紹。這個例子是一個管理人員資訊的程式。不過因為這只是一個示例,所以這個程式只是一個簡單的ConsoleApplication。使用Console Application來做示例程式可以免掉一些介面設計的工作。這個程式通過Index來管理人員資訊。人員資訊包括Name、Telephone和Address。程式通過TstringList來讀取人員資訊檔案,然後用那些指向Record的指標把資訊存放在TList裡並修改。程式碼如下:
程式程式碼
program Info[color=#0000ff];
{$APPTYPE CONSOLE}
uses
SysUtils, Classes;
type
PInfo=^TInfo;
TInfo=record
Name:String;
Tel:String;
Address:String;
end;
var
SL:TstringList;
List:TList;
AppPath:String;
{ 開闢一個新的PInfo 指標,填入資訊並返回指標將在Command_Delete 或FinaInfo 裡釋放 }
function MakeInfo(Name,Tel,Address:String):PInfo;
var P:PInfo;
begin
New(P);
P^.Name:=Name;
P^.Tel:=Tel;
P^.Address:=Address;
{ 返回的指標將被儲存在List 裡 }
result:=P;
end;
{ 在螢幕上列印所有可用的命令 }
procedure PrintMenu;
begin
writeln(/'======選單======/');
writeln(/'V---- 檢視所有人員的資訊/');
writeln(/'A---- 增添新的人員資訊/');
writeln(/'D----刪除人員/');
writeln(/'E---- 修改人員資訊/');
writeln(/'M---- 檢視所有可用命令/');
writeln(/'X----退出程式/');
end;
{ 修改人員資訊的程式 }
procedure Command_Edit;
var I:Integer;
Name,Tel,Address:String;
P:PInfo;
begin
write(/' 請輸入要修改的人員資訊的序號:/');
readln(I);
if(I<0)or(I>=List.Count)then
writeln(/' 輸入超出範圍。/')
else
begin
{ 取得某個人員資訊的指標 }
P:=List.Items;
writeln(/' 開始輸入人員資訊(若某項資訊不需要修改則留
空):/');
write(/' 姓名:/');
readln(Name);
write(/' 電話號碼:/');
readln(Tel);
write(/' 地址:/');
readln(Address);
{ 儲存輸入的資訊 }
if Name<>/'/' then P^.Name:=Name;
if Tel<>/'/' then P^.Tel:=Tel;
if Address<>/'/' then P^.Address:=Address;
writeln(/' 修改人員資訊執行完畢。/');
end;
end;
{ 增加人員資訊的程式 }
procedure Command_Add;
var Name,Tel,Address:String;
begin
writeln(/' 開始輸入人員資訊:/');
write(/' 姓名:/');
readln(Name);
write(/' 電話號碼:/');
readln(Tel);
write(/' 地址:/');
readln(Address);
{ 使用MakeInfo 生成TInfo 的指標
並加入Tlist 中 }
List.Add(MakeInfo(Name,Tel,Address));
writeln(/' 增加人員資訊執行完畢。/');
end;
{ 列印所有人員資訊的程式 }
procedure Command_View;
var I:Integer;
P:PInfo;
begin
writeln(/' 人員資訊列表:/');
for I:=0 to List.Count-1 do
begin
P:=List.Items;
writeln(IntToStr(I)+/'號===================/');
writeln(/'姓名:/'+P^.Name);
writeln(/'電話:/'+P^.Tel);
writeln(/'地址:/'+P^.Address);
{ 滿六個就暫停,剛好填滿一個螢幕 }
if I mod 6=5 then
begin
writeln(/' 請按回車鍵繼續。/');
readln;
end;
end;
writeln;
end;
{ 刪除人員資訊的程式 }
procedure Command_Delete;
var I:Integer;
P:PInfo;
begin
write(/' 請輸入要刪除的人員資訊的序號:/');
readln(I);
if(I<0)or(I>=List.Count)then
writeln(/' 輸入超出範圍。/')
else
begin
P:=List.Items;
List.Delete(I);
Dispose(P);
writeln(/' 刪除執行完畢。/');
writeln;
end;
end;
{ 處理使用者輸入的命令 }
function GetCommand:Boolean;
{ 返回False 表示退出 }
var C:Char;
begin
write(/' 輸入命令並回車:/');
readln(C);
result:=True;
case C of
/'V/',/'v/':Command_View;
/'A/',/'a/':Command_Add;
/'D/',/'d/':Command_Delete;
/'M/',/'m/':PrintMenu;
/'X/',/'x/':result:=False;
/'E/',/'e/':Command_Edit;
else writeln(/' 未知命令。/');
end;
end;
{ 從Info.txt 把人員資訊載入入Tlist }
procedure LoadInfo;
var I:Integer;
Name,Tel,Address,Index:String;
begin
SL.LoadFromFile(AppPath+/'Info.txt/');
for I:=0 to SL.Count div 3-1 do
begin
Index:=IntToStr(I)+/'./';
{ 檔案格式:Index.Field=Value
在這裡使用Index.X 區別不同序號的人員資訊的欄位名稱
然後通過Values 屬性讀取資訊 }
Name:=SL.Values[Index+/'Name/'];
Tel:=SL.Values[Index+/'Tel/'];
Address:=SL.Values[Index+/'Address/'];
List.Add(MakeInfo(Name,Tel,Address));
end;
end;
{ 把TList 裡的人員資訊儲存到Info.txt }
procedure SaveInfo;
var I:Integer;
P:PInfo;
begin
SL.Clear;{ 清空TstringList }
for I:=0 to List.Count-1 do
begin
P:=List.Items;
SL.Add(IntToStr(I)+/'.Name=/'+P^.Name);
SL.Add(IntToStr(I)+/'.Tel=/'+P^.Tel);
SL.Add(IntToStr(I)+/'.Address=/'+P^.Address);
end;
SL.SaveToFile(AppPath+/'Info.txt/');
end;
{ 初始化程式 }
procedure InitInfo;
begin
SL:=TstringList.Create;
List:=TList.Create;
{ 獲得本程式所在的路徑 }
AppPath:=ExtractFilePath(ParamStr(0));
end;
{ 清空程式使用的記憶體 }
procedure FinaInfo;
var I:Integer;
begin
for I:=0 to List.Count-1 do
Dispose(PInfo(List.Items));
List.Free;
SL.Free;
end;
begin
{ TODO -oUser -cConsole Main : Insert code here }
InitInfo;
LoadInfo;
writeln(/'Information Editor V1.0 by VCZH/');
PrintMenu;
while GetCommand do;{ 迴圈直到返回False }
SaveInfo;
FinaInfo;
writeln(/' 謝謝使用。請按回車鍵退出程式。/');
readln;
end.[/color]
在這個程式測試完畢(由於時間關係,並沒有執行嚴格的測試,所以一些小細節可能會沒有注意到,不過不會影響程式功能的正確性)時,Info.txt 的內容如下
在迴圈開始時,I 的值被指向0,然後Index的值就變成“0.”。在執行Name:=SL.Values[Index+/'Name/']時,就等於執行Name:=SL.Values[/'0.Name/']於是, “0.Name”這個欄位的內容就被讀取,然後Name 就變成了“vczh ”。接著進入下一個迴圈。程式就是通過在欄位前加“Index.”這樣的方法區別不同人員的資訊。在讀取完一個人的資訊後,程式執行List.Add(MakeInfo(Name,Tel,Address)),資訊便存放在List裡了。程式通過操作List 增加、刪除或修改人員資訊。在使用者退出程式時,程式將List裡的所有資訊儲存在“Info.txt”裡。過程是這樣的:程式先清空SL 裡的內容,然後按照Info.txt原來的檔案格式填寫資訊。因為Info.txt裡的人員數目是會改變的,因此便不能使用TstringList.Values屬性修改,而必須在清空TstringList後手動構建欄位並填寫資訊。
0.Name=vczh
0.Tel=1234567
0.Address=Jupiter
1.Name= 陳梓瀚
1.Tel=8888888
1.Address=Venus
2.Name=chenzihan
2.Tel=9999999
2.Address=Mars
3.Name=Victor
3.Tel=0000000
3.Address=Saturn
經過這樣的介紹,大家對Delphi 包含的與List,有相似性質的類都有了一定的認識。Delphi VCL 開發組為我們準備了這麼多既實用又有效率的功能。而List在龐大的Delphi VCL 裡只是滄海一粟。所以我們今後應當繼續研究Delphi VCL,充分利用 VCL,為自己的專案增添光輝。
相關推薦
Delphi 小談之TList 篇
最近開發程式需要使用TList功能,轉載此文章,以作參考。 看了這裡標題,大家可能以為我會談TListBox控制元件,那就錯了。我要談的是Delphi提供給我們的具有列表性質的類:TstringList、TList和TObjectList。TstringList用來存放字
與其放在電腦裏占內存,還不如拿出來幫助一群小白白之html篇之四
ext one mar solid ul li lis class eight seo <!doctype html><html><head><meta charset="utf-8"><title>無標題文檔&l
與其放在電腦裏占內存,還不如拿出來幫助一群小白白之html篇之一
電腦 text htm document cal ngs all ply cti <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <t
與其放在電腦裏占內存,還不如拿出來幫助一群小白白之html篇之二
ext tco confirm char utf type lang html click <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8">
與其放在電腦裏占內存,還不如拿出來幫助一群小白白之html篇之三
var wid gin ack document type solid load ntb <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> &
與其放在電腦裏占內存,還不如拿出來幫助一群小白白之html篇之五
mon one cli tle .get put cas true stc <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <titl
與其放在電腦裏占內存,還不如拿出來幫助一群小白白之html篇之十
cell pan adding rowspan add 歌曲 作者 ctype lsp <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> &l
與其放在電腦裏占內存,還不如拿出來幫助一群小白白之html篇之十一
dcl body window let ctype urn doctype 繼續 document <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><
小程式之入門篇(一)
大家好,我是小編,這幾天自己學習了小程式,發現真的太爽了,以下是我寫下的筆記,希望給入門的盆友提供一些幫助吧。 app.js 用於監聽並處理小程式的生命週期函式,宣告全域性變數,呼叫框架,提供豐富的API 同步儲存:wx.setStorageSync()
Delphi容器類之---Tlist,TStringlist,THashedStringlist的效率比較
本人在做一個測試,伺服器是IOCP的,我假定最大連線數是50000個。如果每個連結之間的資料需要伺服器中轉的話,那麼我需要一個數據容器儲存使用者的關鍵資料和連結。以上是測試背景。剛剛我簡單的做了一段簡單的程式碼,關鍵程式碼段如下:RTest = record Key:
golang中json小談之字串轉浮點數
有時會有這種需求,將一個json資料形如: {"x":"golang", "y":"520.1314"} 中的y反序列化為浮點型別,如果這樣寫: package main import ( "encoding/json" "fmt
Delphi容器類之---TList、TStringList、TObjectList,以及一個例程的程式碼分析
看了這裡標題,大家可能以為我會談TListBox控制元件,那就錯了。我要談的是Delphi提供給我們的具有列表性質的類:TStringList、TList和TObjectList。TStringList用來存放字串,TList存放指標,而TObjectList則存
python之 小甲魚教程 Easygui 篇
重要 顯示錯誤 小甲魚 博客 str BE 表示 files enter 博客轉自 https://blog.csdn.net/bestallen/article/details/51933427 終於有點實質性可以看到摸到的界面了,搜了一下雖然easygu
【數學】kd 樹演算法之思路篇(憂傷的小兔子)
導語:kd 樹是一種二叉樹資料結構,可以用來進行高效的 kNN 計算。kd 樹演算法偏於複雜,本篇將先介紹以二叉樹的形式來記錄和索引空間的思路,以便讀者更輕鬆地理解 kd 樹。 圖較多,小心流量 作者:肖睿編輯:巨集觀經濟算命師本文由JoinQuant量化課堂推出,本文的難度屬於
yxy和志願者小姐姐番外篇之大寶寶123追番記(補題,淘汰賽)
1264: yxy和志願者小姐姐番外篇之大寶寶123追番記
如何寫出一手好的小程式之多端架構篇
作為微信小程式底層 API 維護者之一,經歷了風風雨雨、各種各樣的吐槽。為了讓大家能更好的寫一手小程式,特地梳理一篇文章介紹。如果有什麼吐槽的地方,歡迎去 developers.weixin.qq.com/ 開發者社群吐槽。 PS: 老闆要找人,對自己有實力的前端er,可以直接發簡歷到我的郵箱:
小白兩篇部落格熟練操作MyCQL 之 第二篇
小白兩篇部落格熟練操作MyCQL 之 第二篇 一. 檢視 檢視是一個虛擬表,其本質是根據SQL語句獲取動態的資料集,併為其命名,使用者使用時只需使用名稱即可獲取結果集, 並可以將其當做表來使用. select * fro
初夏小談:記憶體管理之常見記憶體錯誤(重點乾貨)
想來說說記憶體管理已經好長時間了,但是不知如何較好的表達。整理了幾天,來給大家分享這種底層問題。 學好C語言就要學好記憶體管理。那麼記憶體分為那幾個區呢? 先來說說記憶體中大致的這幾個區:棧區,堆區,全域性變數區,和程式碼區。 棧區:就是用來儲存區域性變數。棧上的
資料結構之排序篇——選擇排序 //交換第i下標與最小下標,只交換一次
首先在陣列的所有元素中找到一個最小的元素, 將該元素與陣列的第一個元素進行交換, 這樣交換之後,陣列的第一個元素就變成了陣列元素中的最小值, 再在除第一個元素外的其它陣列元素中,尋找最小的陣列元素, 將這個第二小的陣列元素與陣列
菜鳥江濤帶你學最小物聯網系統之模組篇(01)—— WIFI模組ESP12F初次親密接觸
最近想搞下物聯網相關的東西,淘寶上買了兩塊ESP12F的WiFi模組,於是大張旗鼓(偷偷摸摸)的搞起來,自己每天的學習進度在部落格上做個記錄,也給有類似想法的同學一個踩坑避雷的借鑑,大家共同進步,好了,閒話不多說,開始進入正題。 1.WIFI模組ESP12F的初次親密接觸。