亚洲欧洲国产欧美一区精品,激情五月亚洲色五月,最新精品国偷自产在线婷婷,欧美婷婷丁香五月天社区

      考試首頁(yè) | 考試用書 | 培訓(xùn)課程 | 模擬考場(chǎng) | 考試論壇  
      全國(guó)  |             |          |          |          |          |         
        當(dāng)前位置:計(jì)算機(jī)等級(jí) > 二級(jí)考試 > C語(yǔ)言程序設(shè)計(jì) > C語(yǔ)言輔導(dǎo) > 文章內(nèi)容
        

      全國(guó)計(jì)算機(jī)等級(jí)考試二級(jí)C語(yǔ)言入門教程(109)

      中華IT學(xué)院   【 】  [ 2016年5月10日 ]

      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)中稱為“鏈表”。圖 7.3為鏈表的示意圖。

      在圖7.3中,第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;
      }

      前兩個(gè)成員項(xiàng)組成數(shù)據(jù)域,后一個(gè)成員項(xiàng) next構(gòu)成指針域, 它是一個(gè)指向 stu類型結(jié)構(gòu)的指針變量。鏈表的基
      本操作對(duì)鏈表的主要操作有以下幾種:

      1.建立鏈表;
      2.結(jié)構(gòu)的查找與輸出;
      3.插入一個(gè)結(jié)點(diǎn);
      4.刪除一個(gè)結(jié)點(diǎn);
      下面通過(guò)例題來(lái)說(shuō)明這些操作。
      [例 7.10]建立一個(gè)三個(gè)結(jié)點(diǎn)的鏈表,存放學(xué)生數(shù)據(jù)。 為簡(jiǎn)單起見, 我們假定學(xué)生數(shù)據(jù)結(jié)構(gòu)中只有學(xué)號(hào)和年齡兩項(xiàng)。

      首頁(yè) 1 2 尾頁(yè)
      分享到:
      本文糾錯(cuò)】【告訴好友】【打印此文】【返回頂部
      將考試網(wǎng)添加到收藏夾 | 每次上網(wǎng)自動(dòng)訪問(wèn)考試網(wǎng) | 復(fù)制本頁(yè)地址,傳給QQ/MSN上的好友 | 申請(qǐng)鏈接 | 意見留言 TOP
      關(guān)于本站  網(wǎng)站聲明  廣告服務(wù)  聯(lián)系方式  站內(nèi)導(dǎo)航  考試論壇
      Copyright © 2006-2017 中華考試網(wǎng)(Examw.com) All Rights Reserved  營(yíng)業(yè)執(zhí)照