C語言課件:第15講C語法專題I_第1頁
C語言課件:第15講C語法專題I_第2頁
C語言課件:第15講C語法專題I_第3頁
C語言課件:第15講C語法專題I_第4頁
C語言課件:第15講C語法專題I_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第15講 C語法專題I,專題1:內(nèi)存分配詳解 專題2:指針、數(shù)組與函數(shù) 專題3:位運算符,1,內(nèi)存區(qū)間的劃分,變量和對象在內(nèi)存中的分配都是編譯器在編譯程序時安排好的,這帶來了極大的不便。例如,數(shù)組必須大開小用,指針必須指向一個已經(jīng)存在的變量或?qū)ο蟆?動態(tài)內(nèi)存分配解決了這個問題! C/C+定義了4個內(nèi)存區(qū)間:代碼區(qū)、全局變量與靜態(tài)變量區(qū)、局部變量區(qū)(棧)和動態(tài)存儲區(qū)(堆heap,或叫自由存儲區(qū))。,2,代碼區(qū),全局?jǐn)?shù)據(jù)區(qū),局部數(shù)據(jù)區(qū),自由存儲區(qū),(棧),(堆),系統(tǒng)分配,編程者進(jìn)行管理,系統(tǒng)分配,系統(tǒng)分配,靜態(tài)與動態(tài)存儲分配的區(qū)別,全局?jǐn)?shù)據(jù)區(qū):全局變量、static變量,編譯時預(yù)分配好內(nèi)存,在程

2、序的整個運行期間都存在。 棧:函數(shù)內(nèi)部的局部變量、返回值,函數(shù)執(zhí)行時,創(chuàng)建存儲單元,函數(shù)執(zhí)行結(jié)束時內(nèi)存被自動釋放。 堆:程序運行時,由malloc等建立內(nèi)存單元,然后由free來釋放。動態(tài)內(nèi)存的生存期由程序員決定。- 動態(tài)內(nèi)存分配,3,動態(tài)內(nèi)存分配函數(shù),typedef unsigned int size_t; malloc函數(shù) void *malloc(size_t size); calloc函數(shù) void *calloc(size_t n, size_t size); realloc函數(shù) void *realloc(void *ptr,size_t size); free函數(shù) void fr

3、ee(void *ptr); C+: new/delete,4,舉例說明,例1:使用malloc函數(shù)分配一個可以容納10個整型元素的內(nèi)存空間,并將其用作一個整型數(shù)組。,5,關(guān)鍵代碼: int * array; array = (int *) malloc (10 * sizeof(int); 注意:待分配內(nèi)存大小不能寫成數(shù)組元素的個數(shù)。,舉例說明,例2:定義一個結(jié)構(gòu),使用malloc函數(shù)分配一個此種結(jié)構(gòu)類型的對象。 struct test int a; char b; int c10; ;,6,關(guān)鍵代碼: struct test * p; p = (struct test *)malloc(s

4、izeof(struct test);,注意問題,malloc函數(shù)是一個庫函數(shù),包含在頭文件stdlib.h中,精簡指令的平臺不能使用該函數(shù),如多數(shù)單片機系統(tǒng)。 指針類型轉(zhuǎn)換是必須的,關(guān)系到分配的內(nèi)存塊的大小,由指針類型決定。 內(nèi)存塊大小的可移植性問題。 malloc分配一個整型變量數(shù)組,內(nèi)存大小決定于參數(shù): 數(shù)組元素個數(shù)n * sizeof(int) calloc分配一個整型變量數(shù)組,內(nèi)存大小決定于雙參數(shù): n, sizeof(int) 思考:sizeof 和 strlen函數(shù)的區(qū)別?,7,一維數(shù)組的動態(tài)創(chuàng)建(malloc),例1:使用malloc函數(shù)分配一個可以容納10個浮點型元素的內(nèi)存空

5、間,并將其用作一個浮點數(shù)組。,8,float * array; int i, n = 10; array = (float *) malloc (n * sizeof(float); for(i=0;in;i+) arrayi = i; printf(“%4.1f”, arrayi); printf(“n”);,/ scanf(“%f”, array+i);,scanf(“%f”, ,/ printf(“%4.1f”, *(array+i) );,float *NewArray(int n) ,return array; ,一維數(shù)組的動態(tài)刪除(free),9,float * array; ar

6、ray = (float *) malloc (n * sizeof(float); / 對數(shù)組進(jìn)行賦值并輸出的操作 free(array); array = NULL;,array = NewArray(n);,void FreeArray(float * array) ,二維數(shù)組的動態(tài)創(chuàng)建與刪除,例2:使用malloc函數(shù)分配一個可以容納5*10個浮點型元素的內(nèi)存空間,并將其用作一個二維浮點數(shù)組。,10,float *p;/ 二維數(shù)組首指針 int m, n;/ 行、列可變 scanf(“%d %d”, / 釋放二維數(shù)組的內(nèi)存空間,float *Myllocate(int m, int n

7、);,11,二維數(shù)組的動態(tài)創(chuàng)建(malloc),float *Myllocate(int m, int n) int i; float *p = (float *)malloc(m*sizeof(float *); for (i=0;im;i+) pi = (float *) malloc (n * sizeof(float); / todo: 元素賦值、輸出 return p; ,pi = NewArray(n);,*(p+i),二維數(shù)組的動態(tài)刪除(free),void De_Myllocate(float *p, int m);,12,void De_Myllocate(float *p,

8、 int m) int i, j; for (i=0;im;i+) free ( pi ); pi = NULL; free(p); p = NULL: ,*(p+i),二維數(shù)組的動態(tài)創(chuàng)建與刪除示意,13,float *,float *,第15講 C語法專題I,專題1:內(nèi)存分配詳解 專題2:指針應(yīng)用詳解 專題3:位運算符,14,指針與數(shù)組,指針變量 float *pointer_1; 指針變量名是pointer_1 ,而不是* pointer_1 。 指向數(shù)組的指針 是數(shù)組名,是指向數(shù)組元素的指針變量,其初值。 引用一個數(shù)組元素,可以用: ) 下標(biāo)法,如 、p形式; ) 指針法,如 *()或

9、*()。,15,指針與數(shù)組,指針變量 float *pointer_1; 指針變量名是pointer_1 ,而不是* pointer_1 。 指向數(shù)組的指針 是數(shù)組名,是指向數(shù)組元素的指針變量,其初值。 引用一個數(shù)組元素,可以用: ) 下標(biāo)法,如 、p形式; ) 指針法,如 *()或 *()。,16,“”和“*”運算符說明,如果已執(zhí)行賦值語句 pointer_a ; * pointer_的含義是什么? “”和“*”兩個運算符的優(yōu)先級別相同; 按自右而左方向結(jié)合:先進(jìn)行* pointer_的運算,即變量a,再執(zhí)行運算; * pointer_與a 相同,即變量a的地址; 如果有 pointer_2

10、 * pointer_1,它的作用是將a(a的地址)賦給pointer_2 ,如果pointer_2原來指向b,經(jīng)過重新賦值后它已不再指向b了,而指向了a。,17,“”和“*”運算符說明,*的含義是什么? 先進(jìn)行運算,得的地址,再進(jìn)行*運算,即所指向的變量,也就是變量a。 *和*pointer_的作用是一樣的,它們都等價于變量。 (*pointer_)+相當(dāng)于a+ 注意:括號是必要的; 沒有括號,相當(dāng)于 *(pointer_+) ,+和*為同一優(yōu)先級別,結(jié)合方向為自右而左; 由于+在pointer_1的右側(cè),是“后加”,即先對pointer_的原值進(jìn)行*運算,得到的值,然后使pointer_的

11、值改變,這樣pointer_不再指向了。,18,指針與函數(shù)返回值,返回值為指針的函數(shù) 一個函數(shù)可以返回一個整型值、字符值、實型值等,也可以返回指針型的數(shù)據(jù),即地址。 函數(shù)一般聲明格式: 類型名 *函數(shù)名(參數(shù)表列); int *a( int x, int y ); 避免值傳遞(復(fù)制數(shù)據(jù))。 文件指針 FILE *fp; 鏈表頭指針 Node *head;,19,與指針相關(guān),指針數(shù)組 指針是變量,也可以像其他變量一樣存儲在數(shù)組中。 float *pf10; char *name = Follow me,BASIC,Great Wall,F(xiàn)ORTRAN, Computer design; 指向指針

12、的指針 指向一個二維數(shù)組的指針 改變指針指向的對象時使用 指向函數(shù)的指針(*_p102) 函數(shù)指針變量常用用途之一是把指針作為參數(shù)傳遞到其他函數(shù)。 類型名 (*函數(shù)名)(參數(shù)表列);,20,有關(guān)指針的數(shù)據(jù)類型小結(jié),21,指針運算小結(jié),指針變量加(減)一個整數(shù) 、等。 指針變量賦值 將一個變量地址賦給一個指針變量,例如: ; 將變量的地址賦給) array; 將數(shù)組array 首元素地址賦給。 array; 將數(shù)組array第個元素的地址賦給 ;p1 和p2都是指針變量,將p2的值賦給p1 max; max為已定義函數(shù)的名稱,將函數(shù)的入口地址賦給,22,指針運算小結(jié),指針變量可以有空值,即指針變

13、量不指向任何變量 可以這樣表示: = NULL; 兩個指針變量可以相減 若兩個指針變量都指向同一個數(shù)組中的元素, 則兩個指針變量值之差是兩個指針之間的元素個數(shù)。 兩個指針變量比較 若兩個指針變量指向同一個數(shù)組中的元素,則可以進(jìn)行比較。 指向前面的元素的指針變量“小于”指向后面元素的指針變量。,23,void 指針類型,ANSIC新標(biāo)準(zhǔn)增加了一種“void”指針類型,即可定義一個指針變量,但不指定它具體指向哪一種數(shù)據(jù)類型。 ANSIC標(biāo)準(zhǔn)規(guī)定,用動態(tài)存儲分配函數(shù)返回的void指針,用來指向一個抽象類型的數(shù)據(jù),在將它的值賦給另一個指針變量時要進(jìn)行強制類型轉(zhuǎn)換,變量類型具體化。 將一個函數(shù)定義為vo

14、id *類型: void *fun (char ch1, char ch2) 表示函數(shù)fun返回的是一個地址,它指向“空類型”; 如果需要引用此地址,也需要進(jìn)行類型轉(zhuǎn)換,例如: p1 = (char *) fun(ch1, ch2);,24,char *p1; void *p2; p1 = (char *) p2 ;,第15講 C語法專題I,專題1:內(nèi)存分配詳解 專題2:指針應(yīng)用詳解 專題3:位運算符,25,位運算符概況,C語言提供6個位操作運算符: &按位與(AND) |按位或(OR) 按位異或(XOR) 右移 按位求反(一元運算符) 位運算符只能作用于整型操作數(shù),即帶符號或無符號的char、short、int與lo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論