C課程講義東南大學(xué)非電類PPT學(xué)習(xí)教案_第1頁
C課程講義東南大學(xué)非電類PPT學(xué)習(xí)教案_第2頁
C課程講義東南大學(xué)非電類PPT學(xué)習(xí)教案_第3頁
C課程講義東南大學(xué)非電類PPT學(xué)習(xí)教案_第4頁
C課程講義東南大學(xué)非電類PPT學(xué)習(xí)教案_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、會(huì)計(jì)學(xué)1C課程講義東南大學(xué)非電類課程講義東南大學(xué)非電類指針與二維數(shù)組int a34=1,2,3,4,5,6,7,8,9,10,11,12;a:二維數(shù)組名 二維數(shù)組的起始地址 第0行地址。 a 三個(gè)一維數(shù)組組成 a0,a1,a2 3個(gè)一維數(shù)組的起始地址 3個(gè)一維數(shù)組名 每個(gè)一維數(shù)組4個(gè)元素第1頁/共57頁指針與二維數(shù)組一維數(shù)組名ai 指向第i行第0列a0 &a00 a00 *a0a0a1a2a00a01a02a03a10a11a12a13a10a21a22a23第2頁/共57頁指針與二維數(shù)組 ai+j 指向第i行第j列元素任一元素aij的指針可以表示為: &aij ai+j 指針偏移 aij *

2、(ai+j);第3頁/共57頁指針與二維數(shù)組二維數(shù)組名 分解成的多個(gè)一維數(shù)組名(代表各行) : a &a0;/0行地址,&區(qū)分為行地址a0 *a;/0行0列元素地址,*區(qū)分為元素地址a+i &ai; ai *(a+i);a00 *a0 *(*a);ai0 *ai *(*(a+i);aij *(ai+j) *(*(a+i)+j);&aij ai+j *(a+i)+j; a可看著指針的指針第4頁/共57頁指針與二維數(shù)組總結(jié): ai 表示第i行第0列元素的地址 a+i 表示第i行地址(偏移i行) &ai表示第i行地址,&不表示取地址,用來區(qū)分元素地址和行地址. *(a+i) 表示第i行第0列元素的地

3、址,*不表示取內(nèi)容,用來區(qū)分元素地址和行地址. 元素指針前加&變成行指針 行指針前加*變成元素指針 元素指針?biāo)阈g(shù)運(yùn)算是偏移多少元素 行指針?biāo)阈g(shù)運(yùn)算是偏移多少行 結(jié)合指針偏移的概念理解 元素指針和行指針是不同的指針*的4種作用:乘、指針定義、取內(nèi)容、區(qū)分為元素地址. 例8.6第5頁/共57頁指向一維數(shù)組的指針對一維數(shù)組,定義一個(gè)指針變量,使它指向數(shù)組的起始地址,則可以用指針代替數(shù)組名來操作數(shù)組。 int a100,*p=&a0; aj和pj 對二維數(shù)組,也可以定義一個(gè)指針變量,來進(jìn)行類似的操作。這就是指向一維數(shù)組的指針變量。數(shù)據(jù)類型 (*指針變量名)常量表達(dá)式;例8.10*(*(p+i)+j)

4、*(pi+j) *(*(a+i)+j) *(ai+j)指向同一元素第6頁/共57頁指向一維數(shù)組的指針int (*pt)3; int x223; 定義了一個(gè)指向一維整型數(shù)組的指針變量pt,該數(shù)組有3個(gè)元素,這3個(gè)元素可以用(*pt)0,(*pt)1,(*pt)2表示,整型。 可以用這個(gè)指針指向二維數(shù)組中的一個(gè)一維數(shù)組(一行)例如:pt=x2表示指針pt指向x2的第0個(gè)一維數(shù)組x20,pt+1則表示指向x2的第1個(gè)一維數(shù)組x21等等。第7頁/共57頁指向一維數(shù)組的指針注意事項(xiàng):int (*pt)3; pt是一個(gè)指針變量,不是一個(gè)指針數(shù)組。 (*pt)0是二維數(shù)組的0行0列元素的值.定義時(shí),它所指向

5、的一維數(shù)組的元素個(gè)數(shù)應(yīng)等于要指向的二維數(shù)組的列數(shù)??梢杂迷撝羔榿碇赶蚨S數(shù)組的一行,再用(*pt)j表示該行的第j個(gè)元素。也可以用該指針來代替二維數(shù)組名, pt+i 是第i行地址,*(pt+i)+j是i行j列元素的地址.4)可以推廣到多維,過于復(fù)雜。第8頁/共57頁第9頁/共57頁指向一維數(shù)組的指針float (*pp)N,xMN;pp=x; pp=pp+1,指針指向了x的下一行,偏移一行相當(dāng)于偏移sizeof(float)*N個(gè)字節(jié)只能將二維數(shù)組x的行地址賦給pp,而不能將x的元素地址賦給pp。pp=xi; / 錯(cuò)誤, xi 是i行0列元素地址pp=ξ /正確,或pp=x+i; 指向一

6、維數(shù)組的指針可以用來處理二維數(shù)組,它指向二維數(shù)組的一行。第10頁/共57頁指向一維數(shù)組的指針指針變量可以指向任何類型的對象,數(shù)組的元素、結(jié)構(gòu)的成員和函數(shù)的參數(shù)也可以是指針類型。 在一個(gè)說明中:先撇開標(biāo)識符,按從右向左的順序逐個(gè)解釋每個(gè)說明符,如果有括號則先解釋括號內(nèi)的再解釋括號外的。int *arrp5; /A int (*arr)5;/BA:首先是五個(gè)元素的數(shù)組,每個(gè)元素是一個(gè)指針,指針指向整型。B:首先是一個(gè)指針,指針指向一個(gè)包含五個(gè)元素的數(shù)組,數(shù)組的每個(gè)元素都是整型的。 第11頁/共57頁第12頁/共57頁主調(diào)函數(shù)中要能訪問ps指向的變量第13頁/共57頁第14頁/共57頁二維數(shù)組地址和

7、元素的表示法表示形式含義a數(shù)組名,起始地址,0行地址a +0第0行起始地址a0第0行第0列元素地址*a,*(a+0)第0行第0列元素地址*a,*(a+0),*a0,*(*(a+0)+0)元素a00a+i,&ai第i行起始地址a+i+j,&ai+j第i+j行起始地址ai,*(a+i)第i行第0列元素地址*(a+i)+j,ai+j,&aij,*&ai+j第i行第j列元素地址*(*(a+i)+j),*(ai+j),*(&aij),*(*&ai+j),aij 第i行第j列元素aIj第15頁/共57頁函數(shù)參數(shù):多維數(shù)組與指針有3種方法:將多維數(shù)組變成一維數(shù)組來處理:最常用方式例8.14 矩陣乘法*(pa

8、+i*n+k)矩陣第i行第k列元素直接使用多維數(shù)組名作參數(shù)使用指向一維數(shù)組的指針變量作參數(shù)void avg(int(*p)4,int n)(*p)i 某行的第i個(gè)元素例8.15 二維數(shù)組的平均值第16頁/共57頁帶參數(shù)的main函數(shù)三種帶參數(shù)的main函數(shù)原型(函數(shù)說明)int main(int argc,char *argv,char *eve);int main(int argc,char *argv,char *eve);int main(int argc,char *argv);argc:參數(shù)個(gè)數(shù)argv:指向字符串的指針數(shù)組,每個(gè)元素指向一個(gè)參數(shù)eve:指向字符串的指針數(shù)組,每個(gè)元素

9、指向一個(gè)環(huán)境變量例8.20 命令行參數(shù)例8.21 環(huán)境參數(shù)第17頁/共57頁函數(shù)指針函數(shù)的指針:函數(shù)的入口地址(運(yùn)行代碼在內(nèi)存中的起始地址)指向函數(shù)的指針變量:一個(gè)指針變量的值為一個(gè)函數(shù)的入口地址定義格式 類型 (*變量名)(形參); 類型是函數(shù)的返回類型 形參表可只有類型說明 括號運(yùn)算符優(yōu)先,右結(jié)合,(*變量名)表示首先是一個(gè)指針變量,(形參)表示是一個(gè)函數(shù)。 float (*fp1)(float a); float *(*fp2)(float*,float*);第18頁/共57頁函數(shù)指針函數(shù)名表示函數(shù)的入口地址,因此可以將函數(shù)名賦給指向函數(shù)的指針變量。指向函數(shù)的指針只能指向與該指針變量具有

10、相同返回值類型和相同參數(shù)的函數(shù)。 float (*fp1)(); float *(*fp2)(float*,float*); float f1(float); float *f2(float*,float*); fp1=f1; /錯(cuò)誤,參數(shù)不一致 fp2=f2; /正確 第19頁/共57頁函數(shù)指針指向函數(shù)的指針變量只能進(jìn)行賦值運(yùn)算和關(guān)系運(yùn)算。對指向函數(shù)的指針變量賦值之后,可以使用該指針變量來調(diào)用函數(shù)。調(diào)用格式: (*指針變量名)(實(shí)參) 或 指針變量名(實(shí)參)指向函數(shù)的指針還可以用作函數(shù)的參數(shù),以實(shí)現(xiàn)在不同的情況下調(diào)用不同的函數(shù)。例8.22 四則運(yùn)算例8.23 數(shù)組統(tǒng)計(jì)值:和、最大、最小、平均

11、例8.24 梯形法求積分第20頁/共57頁函數(shù)指針函數(shù)指針組成的數(shù)組稱為函數(shù)指針數(shù)組:存儲(chǔ)類型 類型 (*數(shù)組名大小)(形參)float (*funarr4)(float *,int);例8.25 簡易計(jì)算器第21頁/共57頁指向函數(shù)的指針第22頁/共57頁第23頁/共57頁第24頁/共57頁指針形式小結(jié)int i, *ip, f(), *fp(), (*fp1)(), *(*fp2)();int a5, *ap5, (*pa)5, *(*fap5)();i一個(gè)整型變量一個(gè)整型變量*ip一個(gè)整型指針變量一個(gè)整型指針變量f()一個(gè)返回整型值的函數(shù)說明一個(gè)返回整型值的函數(shù)說明*fp()一個(gè)返回整型

12、指針的函數(shù)說明一個(gè)返回整型指針的函數(shù)說明(*fp1)()一個(gè)函數(shù)指針變量,函數(shù)返回整型值一個(gè)函數(shù)指針變量,函數(shù)返回整型值*(*fp2)()一個(gè)函數(shù)指針,函數(shù)返回一個(gè)整型指針一個(gè)函數(shù)指針,函數(shù)返回一個(gè)整型指針a5五個(gè)整型元素?cái)?shù)組五個(gè)整型元素?cái)?shù)組*ap5五個(gè)整型指針數(shù)組五個(gè)整型指針數(shù)組(*pa)5指向一維數(shù)組(有指向一維數(shù)組(有5個(gè)整型元素)的指針個(gè)整型元素)的指針*(*fap5)()一個(gè)指針數(shù)組,該數(shù)組的每個(gè)元素都是指向函數(shù)的指一個(gè)指針數(shù)組,該數(shù)組的每個(gè)元素都是指向函數(shù)的指針,而所指向的函數(shù)的返回值是整型指針針,而所指向的函數(shù)的返回值是整型指針第25頁/共57頁動(dòng)態(tài)內(nèi)存分配動(dòng)態(tài)存儲(chǔ)分配是指在運(yùn)行

13、時(shí)根據(jù)程序要求為變量等對象分配存儲(chǔ)空間的方法有時(shí),只有在程序運(yùn)行期間才能確定所需要的操作對象(比如動(dòng)態(tài)大小的數(shù)組),這樣編譯系統(tǒng)就無法根據(jù)其大小預(yù)留存儲(chǔ)空間,只能在程序運(yùn)行時(shí)根據(jù)程序執(zhí)行的要求分配內(nèi)存空間通常變量,無論是基本類型的變量還是派生類型的變量,無論是全局變量還是局部變量,編譯系統(tǒng)在編譯時(shí)都會(huì)根據(jù)變量的類型確定其大小,這種內(nèi)存的分配方式稱為靜態(tài)存儲(chǔ)分配。第26頁/共57頁動(dòng)態(tài)內(nèi)存分配在程序執(zhí)行時(shí),系統(tǒng)會(huì)為程序預(yù)留一塊專門用于供動(dòng)態(tài)存儲(chǔ)分配的存儲(chǔ)空間,這塊存儲(chǔ)空間稱為動(dòng)態(tài)分配區(qū)(或自由存儲(chǔ)空間)。 程序在需要一個(gè)動(dòng)態(tài)分配的數(shù)據(jù)元素時(shí),必須向系統(tǒng)申請一塊內(nèi)存用于存放該元素,在不再需要使用這

14、種動(dòng)態(tài)分配的數(shù)據(jù)元素后,必須將它所占據(jù)的存儲(chǔ)空間釋放,將該存儲(chǔ)空間歸還給動(dòng)態(tài)分配區(qū)以便系統(tǒng)能再次分配使用。 動(dòng)態(tài)存儲(chǔ)分配是由指針來實(shí)現(xiàn)的。在C+中,用new和delete運(yùn)算符來完成申請和釋放空間的任務(wù)。 申請使用釋放第27頁/共57頁new與deletenew運(yùn)算符用于申請動(dòng)態(tài)存儲(chǔ)空間。指針new 類型; 指針new 類型(初值); 指針new 類型表達(dá)式; /動(dòng)態(tài)一維數(shù)組指針new 類型表達(dá)式 常量表達(dá)式; /動(dòng)態(tài)二維數(shù)組int n;cinn;float *p=new floatn;例8.26 動(dòng)態(tài)內(nèi)存分配分配失敗,返回指針值為0(空指針)第28頁/共57頁第29頁/共57頁第30頁/共5

15、7頁new與delete delete運(yùn)算符用于將申請的動(dòng)態(tài)存儲(chǔ)空間還給系統(tǒng)。delete 指針; delete 指針; /一維動(dòng)態(tài)數(shù)組delete 表達(dá)式指針; /二維動(dòng)態(tài)數(shù)組delete np;第31頁/共57頁new、delete注意事項(xiàng)如果不初始化,new申請到的內(nèi)存空間中存儲(chǔ)的是隨機(jī)值若申請較多的內(nèi)存,需要判斷指針的值是否為0,為0表示申請內(nèi)存失敗,此時(shí)要進(jìn)行出錯(cuò)處理為動(dòng)態(tài)數(shù)組、結(jié)構(gòu)申請存儲(chǔ)空間,不能在申請時(shí)進(jìn)行初始化int *p=new int10(1,2,3,4,5,6,7);第32頁/共57頁new、delete注意事項(xiàng)用new運(yùn)算符分配的內(nèi)存空間的指針必須保存起來,以便用de

16、lete歸還已分配的內(nèi)存空間,否則會(huì)導(dǎo)致內(nèi)存泄漏. float *fp,i; fp=new float; *fp=24.5; fp=&i; delete fp; /沒有指向動(dòng)態(tài)分配的空間第33頁/共57頁new、delete注意事項(xiàng)delete釋放一個(gè)指針(內(nèi)存空間)后,不返回任何值,釋放之后,指針值無意義,不能再對指針指向的內(nèi)存空間賦值 float *p=new float; *p=3.2; delete p; *p=3.5; /p的指向不確定第34頁/共57頁多維數(shù)組的分配與釋放利用指向多維數(shù)組的指針,可動(dòng)態(tài)為多維數(shù)組分配內(nèi)存空間若new運(yùn)算出來的指針類型與左值的類型不符時(shí), 要進(jìn)行強(qiáng)制類

17、型轉(zhuǎn)換 float (*p1)20, (*p2)20; p1=new float20; / p1=(float*)20)new float20; / p1=new float120; / p2=new float1020; / int *p3=new int1020; / p3=(int*)new int1020; / p3=new int10*20; /動(dòng)態(tài)分配了二維數(shù)組的存儲(chǔ)空間后, 釋放時(shí)需要指定數(shù)組的行數(shù) int (*p)100=new int30100; /數(shù)組大小固定 delete 30p;第35頁/共57頁指針使用常見錯(cuò)誤由于通過指針可以直接對內(nèi)存尋址,所以指針操作具有靈活高效的

18、特點(diǎn),但如果指針使用不當(dāng),則會(huì)造成難以想象的結(jié)果。 常見的有以下幾種錯(cuò)誤: 定義指針變量后,未賦給它一個(gè)地址值就使用該指針變量。int *p;*p=125; 定義一個(gè)整型指針,即意味著分配給該指針變量一個(gè)內(nèi)存區(qū),其中存放的值必須是另一個(gè)整型量的地址. 正確的用法是:int *p;p=new int(125); 同樣,刪除一個(gè)未賦值的指針也是危險(xiǎn)的。int*p; delete p; 第36頁/共57頁指針使用常見錯(cuò)誤 指針懸掛問題。int *p1,*p2;p1=new int(98);p2=new int(99);p1=p2;delete p1;delete p2; 由于p1=p2使p1和p2指

19、向同一個(gè)整型量存儲(chǔ)區(qū),經(jīng)過上述操作后,p1原來所指的空間就無法再用,甚至無法回收,此就是所謂的指針懸掛 (內(nèi)存泄漏)P1P29899第37頁/共57頁指針使用常見錯(cuò)誤 字符串的賦值。char str=C+ Language;char *ps;ps=new char13;ps=str;/ 指針賦值delete ps;上面的第三句不起任何作用,因?yàn)榈谒木溆米址畇tr的存儲(chǔ)首地址重新為ps賦值。 應(yīng)該使用:strcpy(ps,str)第38頁/共57頁指針使用常見錯(cuò)誤 返回指針(或返回引用)的函數(shù)要避免函數(shù)返回后引用對象已不存在的情況。int *fun() int j=5;return &j;函數(shù)

20、返回后,自動(dòng)變量j已不存在,返回自動(dòng)變量的地址是不正確的。int j;/ 全局變量int *fun() return &j;或int *fun() static int j=5;return &j;/ 靜態(tài)變量或int *fun() int *j=new int(5);return j; / 動(dòng)態(tài)分配的內(nèi)存地址第39頁/共57頁引用類型一種特殊的數(shù)據(jù)類型本質(zhì)是一個(gè)已有變量的別名系統(tǒng)不為引用類型變量分配空間,而與其關(guān)聯(lián)變量使用同一空間引用主要用于函數(shù)之間傳遞數(shù)據(jù)傳引用定義格式: 類型 & 引用變量名=變量名n 變量必須是一個(gè)已經(jīng)定義過的變量int i; int &i1=i;第40頁/共57頁引用

21、類型引用類型變量初始化注意事項(xiàng): 1) 定義引用時(shí)必須初始化,且初始化的類型變量必須和引用變量的類型相同. float x; int &px=x; /2) 引用類型的初始化值不能是常數(shù) float &ref=5; / const float &ref=5; / ref是5的引用,后面將學(xué)習(xí)3) 同類型的引用變量可以互相賦值. int i,&ref1=i; int &ref2=ref1; / int &ref3=ref2; / int &ref4=&ref1; / int &ref5=&ref1;/第41頁/共57頁引用類型引用類型變量初始化注意事項(xiàng): 4) 引用變量不能初始化為數(shù)組,但可以初始化為數(shù)組的一個(gè)元素. int a10; int &refa=a; / int &refaa10=a; / int &*refa3=a; /,寫法錯(cuò)誤 int &refa2=a2; /5) 可

溫馨提示

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

評論

0/150

提交評論