首頁(yè)考試吧論壇Exam8視線考試商城網(wǎng)絡(luò)課程模擬考試考友錄實(shí)用文檔求職招聘論文下載
2013中考
法律碩士
2013高考
MBA考試
2013考研
MPA考試
在職研
中科院
考研培訓(xùn) 自學(xué)考試 成人高考
四 六 級(jí)
GRE考試
攻碩英語(yǔ)
零起點(diǎn)日語(yǔ)
職稱英語(yǔ)
口譯筆譯
申碩英語(yǔ)
零起點(diǎn)韓語(yǔ)
商務(wù)英語(yǔ)
日語(yǔ)等級(jí)
GMAT考試
公共英語(yǔ)
職稱日語(yǔ)
新概念英語(yǔ)
專四專八
博思考試
零起點(diǎn)英語(yǔ)
托福考試
托業(yè)考試
零起點(diǎn)法語(yǔ)
雅思考試
成人英語(yǔ)三級(jí)
零起點(diǎn)德語(yǔ)
等級(jí)考試
華為認(rèn)證
水平考試
Java認(rèn)證
職稱計(jì)算機(jī) 微軟認(rèn)證 思科認(rèn)證 Oracle認(rèn)證 Linux認(rèn)證
公 務(wù) 員
導(dǎo)游考試
物 流 師
出版資格
單 證 員
報(bào) 關(guān) 員
外 銷 員
價(jià)格鑒證
網(wǎng)絡(luò)編輯
駕 駛 員
報(bào)檢員
法律顧問(wèn)
管理咨詢
企業(yè)培訓(xùn)
社會(huì)工作者
銀行從業(yè)
教師資格
營(yíng)養(yǎng)師
保險(xiǎn)從業(yè)
普 通 話
證券從業(yè)
跟 單 員
秘書資格
電子商務(wù)
期貨考試
國(guó)際商務(wù)
心理咨詢
營(yíng) 銷 師
司法考試
國(guó)際貨運(yùn)代理人
人力資源管理師
廣告師職業(yè)水平
衛(wèi)生資格 執(zhí)業(yè)醫(yī)師 執(zhí)業(yè)藥師 執(zhí)業(yè)護(hù)士
會(huì)計(jì)從業(yè)資格
基金從業(yè)資格
統(tǒng)計(jì)從業(yè)資格
經(jīng)濟(jì)師
精算師
統(tǒng)計(jì)師
會(huì)計(jì)職稱
法律顧問(wèn)
ACCA考試
注冊(cè)會(huì)計(jì)師
資產(chǎn)評(píng)估師
審計(jì)師考試
高級(jí)會(huì)計(jì)師
注冊(cè)稅務(wù)師
國(guó)際內(nèi)審師
理財(cái)規(guī)劃師
美國(guó)注冊(cè)會(huì)計(jì)師
一級(jí)建造師
安全工程師
設(shè)備監(jiān)理師
公路監(jiān)理師
公路造價(jià)師
二級(jí)建造師
招標(biāo)師考試
物業(yè)管理師
電氣工程師
建筑師考試
造價(jià)工程師
注冊(cè)測(cè)繪師
質(zhì)量工程師
巖土工程師
造價(jià)員考試
注冊(cè)計(jì)量師
環(huán)保工程師
化工工程師
咨詢工程師
結(jié)構(gòu)工程師
城市規(guī)劃師
材料員考試
監(jiān)理工程師
房地產(chǎn)估價(jià)
土地估價(jià)師
安全評(píng)價(jià)師
房地產(chǎn)經(jīng)紀(jì)人
投資項(xiàng)目管理師
環(huán)境影響評(píng)價(jià)師
土地登記代理人
繽紛校園 實(shí)用文檔 英語(yǔ)學(xué)習(xí) 作文大全 求職招聘 論文下載 訪談|游戲
軟件水平考試
軟件水平考試資訊
軟件水平考試試題
軟件水平考試專項(xiàng)輔導(dǎo)
軟件水平考試交流互動(dòng)
軟件水平考試交流互動(dòng)
您現(xiàn)在的位置: 考試吧 > 軟件水平考試 > 復(fù)習(xí)資料 > 程序員資料 > 正文

C語(yǔ)言初學(xué)者入門知識(shí)之結(jié)構(gòu)體3

  topoic=動(dòng)態(tài)存儲(chǔ)分配

  在數(shù)組一章中,曾介紹過(guò)數(shù)組的長(zhǎng)度是預(yù)先定義好的, 在整個(gè)程序中固定不變。C語(yǔ)言中不允許動(dòng)態(tài)數(shù)組類型。例如: int n;scanf("%d",&n);int a[n]; 用變量表示長(zhǎng)度,想對(duì)數(shù)組的大小作動(dòng)態(tài)說(shuō)明,這是錯(cuò)誤的。但是在實(shí)際的編程中,往往會(huì)發(fā)生這種情況, 即所需的內(nèi)存空間取決于實(shí)際輸入的數(shù)據(jù),而無(wú)法預(yù)先確定。對(duì)于這種問(wèn)題,用數(shù)組的辦法很難解決。為了解決上述問(wèn)題,C語(yǔ)言提供了一些內(nèi)存管理函數(shù),這些內(nèi)存管理函數(shù)可以按需要?jiǎng)討B(tài)地分配內(nèi)存空間,也可把不再使用的空間回收待用,為有效地利用內(nèi)存資源提供了手段。 常用的內(nèi)存管理函數(shù)有以下三個(gè):

  1.分配內(nèi)存空間函數(shù)malloc

  調(diào)用形式: (類型說(shuō)明符*) malloc (size) 功能:在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一塊長(zhǎng)度為“size”字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。 “類型說(shuō)明符”表示把該區(qū)域用于何種數(shù)據(jù)類型。(類型說(shuō)明符*)表示把返回值強(qiáng)制轉(zhuǎn)換為該類型指針!皊ize”是一個(gè)無(wú)符號(hào)數(shù)。例如: pc=(char *) malloc (100); 表示分配100個(gè)字節(jié)的內(nèi)存空間,并強(qiáng)制轉(zhuǎn)換為字符數(shù)組類型, 函數(shù)的返回值為指向該字符數(shù)組的指針, 把該指針賦予指針變量pc。

  2.分配內(nèi)存空間函數(shù) calloc

  calloc 也用于分配內(nèi)存空間。調(diào)用形式: (類型說(shuō)明符*)calloc(n,size) 功能:在內(nèi)存動(dòng)態(tài)存儲(chǔ)區(qū)中分配n塊長(zhǎng)度為“size”字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。(類型說(shuō)明符*)用于強(qiáng)制類型轉(zhuǎn)換。calloc函數(shù)與malloc 函數(shù)的區(qū)別僅在于一次可以分配n塊區(qū)域。例如: ps=(struet stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的結(jié)構(gòu)長(zhǎng)度。因此該語(yǔ)句的意思是:按stu的長(zhǎng)度分配2塊連續(xù)區(qū)域,強(qiáng)制轉(zhuǎn)換為stu類型,并把其首地址賦予指針變量ps。

  3.釋放內(nèi)存空間函數(shù)free

  調(diào)用形式: free(void*ptr); 功能:釋放ptr所指向的一塊內(nèi)存空間,ptr 是一個(gè)任意類型的指針變量,它指向被釋放區(qū)域的首地址。被釋放區(qū)應(yīng)是由malloc或calloc函數(shù)所分配的區(qū)域:[例7.9]分配一塊區(qū)域,輸入一個(gè)學(xué)生數(shù)據(jù)。

  main()

  {

  struct stu

  {

  int num;

  char *name;

  char sex;

  float score;

  } *ps;

  ps=(struct stu*)malloc(sizeof(struct stu));

  ps->num=102;

  ps->name="Zhang ping";

  ps->sex='M';

  ps->score=62.5;

  printf("Number=%d\nName=%s\n",ps->num,ps->name);

  printf("Sex=%c\nScore=%f\n",ps->sex,ps->score);

  free(ps);

  }

  本例中,定義了結(jié)構(gòu)stu,定義了stu類型指針變量ps。然后分配一塊stu大內(nèi)存區(qū),并把首地址賦予ps,使ps指向該區(qū)域。再以ps為指向結(jié)構(gòu)的指針變量對(duì)各成員賦值,并用printf 輸出各成員值。最后用free函數(shù)釋放ps指向的內(nèi)存空間。 整個(gè)程序包含了申請(qǐng)內(nèi)存空間、使用內(nèi)存空間、釋放內(nèi)存空間三個(gè)步驟,實(shí)現(xiàn)存儲(chǔ)空間的動(dòng)態(tài)分配。鏈表的概念在例7.9中采用了動(dòng)態(tài)分配的辦法為一個(gè)結(jié)構(gòu)分配內(nèi)存空間。每一次分配一塊空間可用來(lái)存放一個(gè)學(xué)生的數(shù)據(jù),我們可稱之為一個(gè)結(jié)點(diǎn)。有多少個(gè)學(xué)生就應(yīng)該申請(qǐng)分配多少塊內(nèi)存空間,也就是說(shuō)要建立多少個(gè)結(jié)點(diǎn)。當(dāng)然用結(jié)構(gòu)數(shù)組也可以完成上述工作,但如果預(yù)先不能準(zhǔn)確把握學(xué)生人數(shù),也就無(wú)法確定數(shù)組大小。而且當(dāng)學(xué)生留級(jí)、退學(xué)之后也不能把該元素占用的空間從數(shù)組中釋放出來(lái)。 用動(dòng)態(tài)存儲(chǔ)的方法可以很好地解決這些問(wèn)題。有一個(gè)學(xué)生就分配一個(gè)結(jié)點(diǎn),無(wú)須預(yù)先確定學(xué)生的準(zhǔn)確人數(shù),某學(xué)生退學(xué), 可刪去該結(jié)點(diǎn),并釋放該結(jié)點(diǎn)占用的存儲(chǔ)空間。從而節(jié)約了寶貴的內(nèi)存資源。 另一方面,用數(shù)組的方法必須占用一塊連續(xù)的內(nèi)存區(qū)域。 而使用動(dòng)態(tài)分配時(shí),每個(gè)結(jié)點(diǎn)之間可以是不連續(xù)的(結(jié)點(diǎn)內(nèi)是連續(xù)的)。結(jié)點(diǎn)之間的聯(lián)系可以用指針實(shí)現(xiàn)。 即在結(jié)點(diǎn)結(jié)構(gòu)中定義一個(gè)成員項(xiàng)用來(lái)存放下一結(jié)點(diǎn)的首地址,這個(gè)用于存放地址的成員,常把它稱為指針域?稍诘谝粋(gè)結(jié)點(diǎn)的指針域內(nèi)存入第二個(gè)結(jié)點(diǎn)的首地址, 在第二個(gè)結(jié)點(diǎn)的指針域內(nèi)又存放第三個(gè)結(jié)點(diǎn)的首地址, 如此串連下去直到最后一個(gè)結(jié)點(diǎn)。最后一個(gè)結(jié)點(diǎn)因無(wú)后續(xù)結(jié)點(diǎn)連接,其指針域可賦為0.這樣一種連接方式,在數(shù)據(jù)結(jié)構(gòu)中稱為“鏈表”。

  在鏈表中,第0個(gè)結(jié)點(diǎn)稱為頭結(jié)點(diǎn), 它存放有第一個(gè)結(jié)點(diǎn)的首地址,它沒(méi)有數(shù)據(jù),只是一個(gè)指針變量。 以下的每個(gè)結(jié)點(diǎn)都分為兩個(gè)域,一個(gè)是數(shù)據(jù)域,存放各種實(shí)際的數(shù)據(jù),如學(xué)號(hào)num,姓名name,性別sex和成績(jī)score等。另一個(gè)域?yàn)橹羔樣颍?存放下一結(jié)點(diǎn)的首地址。鏈表中的每一個(gè)結(jié)點(diǎn)都是同一種結(jié)構(gòu)類型。例如,一個(gè)存放學(xué)生學(xué)號(hào)和成績(jī)的結(jié)點(diǎn)應(yīng)為以下結(jié)構(gòu):

  struct stu

  {

  int num;

  int score;

  struct stu *next;

  }

  相關(guān)推薦:

  2012年軟考系統(tǒng)分析師考試60天完美復(fù)習(xí)計(jì)劃

  2012年軟件水平考試網(wǎng)絡(luò)工程師章節(jié)筆記講義匯總

  2012年上半年軟件水平考試成績(jī)查詢匯總

文章搜索
軟件水平考試欄目導(dǎo)航
版權(quán)聲明:如果軟件水平考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請(qǐng)與我們聯(lián)系800@exam8.com,我們將會(huì)及時(shí)處理。如轉(zhuǎn)載本軟件水平考試網(wǎng)內(nèi)容,請(qǐng)注明出處。