




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、2022-5-161C語言程序設(shè)計(jì) 2022-5-162第十章 二維數(shù)組與指針主講主講: : 計(jì)算機(jī)學(xué)院計(jì)算機(jī)學(xué)院 俞瓊俞瓊n本章介紹二維數(shù)組的有關(guān)知識(shí):本章介紹二維數(shù)組的有關(guān)知識(shí):二維數(shù)組的定義二維數(shù)組的定義,其中涉及的其中涉及的3種類型種類型二維數(shù)組的初始化二維數(shù)組的初始化二維數(shù)二維數(shù)組的元素訪問方式組的元素訪問方式n與二維數(shù)組相關(guān)的各類指針:與二維數(shù)組相關(guān)的各類指針:行指針行指針列指針列指針二級(jí)指針二級(jí)指針一維指針數(shù)組一維指針數(shù)組n動(dòng)態(tài)二維數(shù)組空間的申請與釋放動(dòng)態(tài)二維數(shù)組空間的申請與釋放(選講選講)如何利用二級(jí)指針申請動(dòng)態(tài)二維數(shù)組空間如何利用二級(jí)指針申請動(dòng)態(tài)二維數(shù)組空間如何依次釋放申請的
2、所有動(dòng)態(tài)空間如何依次釋放申請的所有動(dòng)態(tài)空間n哪里需要二維數(shù)組?哪里需要二維數(shù)組?類型相同的一組數(shù)類型相同的一組數(shù), ,如果在序列中如果在序列中只受一種序號(hào)標(biāo)明只受一種序號(hào)標(biāo)明其在整其在整個(gè)序列中的順序個(gè)序列中的順序, ,用用一維數(shù)組一維數(shù)組, ,例如例如: :1 1門課各個(gè)同學(xué)的成績門課各個(gè)同學(xué)的成績 類型相同的一組數(shù)類型相同的一組數(shù), ,如果在序列中需要用如果在序列中需要用兩種序號(hào)標(biāo)明兩種序號(hào)標(biāo)明其在其在整個(gè)序列中的順序整個(gè)序列中的順序, ,則要用則要用二維數(shù)組二維數(shù)組, ,例如例如: :3 3門課各個(gè)同學(xué)的門課各個(gè)同學(xué)的成績成績矩陣問題強(qiáng)調(diào)元素所在的行、列位置矩陣問題強(qiáng)調(diào)元素所在的行、列位
3、置, ,必須用必須用二維數(shù)組二維數(shù)組n二維數(shù)組的定義形式:二維數(shù)組的定義形式: 類型標(biāo)識(shí)符類型標(biāo)識(shí)符 數(shù)組名數(shù)組名 整型常量表達(dá)式整型常量表達(dá)式1 1 整型常量表達(dá)式整型常量表達(dá)式22; 例:例:intint a43 a43;/定義定義4 4行行3 3列的整型二維數(shù)組,數(shù)組名為列的整型二維數(shù)組,數(shù)組名為a a 二維數(shù)組的二維數(shù)組的元素類型元素類型二維數(shù)組名是一個(gè)用二維數(shù)組名是一個(gè)用戶自定義標(biāo)識(shí)符戶自定義標(biāo)識(shí)符指明二維數(shù)指明二維數(shù)組的行數(shù)組的行數(shù)指明二維數(shù)指明二維數(shù)組的列數(shù)組的列數(shù)n二維數(shù)組的實(shí)質(zhì)分析:二維數(shù)組的實(shí)質(zhì)分析:二維數(shù)組是二維數(shù)組是一維數(shù)組的一維數(shù)組(遞歸定義)一維數(shù)組的一維數(shù)組(遞歸
4、定義)例:例:intint a43; a43;(1)(1)這里,這里,a a是二維數(shù)組名是二維數(shù)組名,也可以理解成是,也可以理解成是一維數(shù)組名一維數(shù)組名a a,它有它有4 4個(gè)元素,分別為個(gè)元素,分別為a0a0、a1a1、a2a2、a3a3(2)a(2)a的的4 4個(gè)元素不是普通的變量,而是都分別是一維數(shù)組,個(gè)元素不是普通的變量,而是都分別是一維數(shù)組,稱為稱為行一維數(shù)組行一維數(shù)組,每一個(gè)都有,每一個(gè)都有3 3個(gè)個(gè)intint型元素型元素,例:,例:a0a0的的3 3個(gè)元素為個(gè)元素為:a00:a00、a01a01、a02a02(3)(3)因此,二維數(shù)組因此,二維數(shù)組a a中共有中共有1212(4
5、 4* *3 3)個(gè)個(gè)intint型的元素:型的元素:a00a00、a01a01、a02a02a10a10、a11a11、a12a12a20a20、a21a21、a22a22a30a30、a31a31、a32a32它們它們4個(gè)稱為個(gè)稱為行一維數(shù)組行一維數(shù)組第第1個(gè)下標(biāo)個(gè)下標(biāo)稱為行下標(biāo)稱為行下標(biāo)第第2個(gè)下標(biāo)個(gè)下標(biāo)稱為列下標(biāo)稱為列下標(biāo)這這1212個(gè)元素稱為個(gè)元素稱為二維數(shù)組元素二維數(shù)組元素行數(shù)行數(shù)列數(shù)列數(shù)n二維數(shù)組定義中含有二維數(shù)組定義中含有3 3種類型種類型: :例:例:intint a43; a43;(1 1)intint 43 43:是二維數(shù)組:是二維數(shù)組a a的類型標(biāo)識(shí)的類型標(biāo)識(shí)(2 2)
6、intint 3: 3: 是行一維數(shù)組是行一維數(shù)組a0a3a0a3的類型標(biāo)識(shí),也是的類型標(biāo)識(shí),也是二維數(shù)組的基類型二維數(shù)組的基類型(3 3)intint: :是二維數(shù)組元素是二維數(shù)組元素a00a32a00a32的類型,也是的類型,也是行一維數(shù)組的基類型行一維數(shù)組的基類型n二維數(shù)組定義中的二維數(shù)組定義中的常量與變量常量與變量: :例:例:intint a43; a43;(1 1)二維數(shù)組)二維數(shù)組a a和行一維數(shù)組和行一維數(shù)組a0a3a0a3均為均為指針常量指針常量(2 2)二維數(shù)組元素)二維數(shù)組元素a00a32a00a32是是intint型的型的變量變量n二維數(shù)組在定義的同時(shí)可為其元素賦值,稱
7、為初始化,二維數(shù)組在定義的同時(shí)可為其元素賦值,稱為初始化,原則:行從左到右依次,每行中列從左到右依次原則:行從左到右依次,每行中列從左到右依次(1 1)逐行初始化逐行初始化: int a43=1,2,3,4,5,6,7,8,9,10,11,12; (2 2)行數(shù)可以缺省,列數(shù)不能省,自動(dòng)算行行數(shù)可以缺省,列數(shù)不能省,自動(dòng)算行 : : int a 3=1,2,3,4,5,6,7,8,9,10,11,12; (3 3)不分行,用類似一維數(shù)組的方式初始化不分行,用類似一維數(shù)組的方式初始化: :int a43=1,2,3,4,5,6,7,8,9,10,11,12; (4 4)初始化數(shù)據(jù)不足,系統(tǒng)用初始
8、化數(shù)據(jù)不足,系統(tǒng)用0 0補(bǔ)充:補(bǔ)充: int a43=1,2,4,5,7,8,9,10,11,12; (5 5)最簡單的初始化最簡單的初始化: int a43=0; 每行單獨(dú)用一每行單獨(dú)用一對大括號(hào)括起對大括號(hào)括起共有兩層大括號(hào)共有兩層大括號(hào)只有一層大括號(hào)只有一層大括號(hào)等效于等效于int a43=1,2,0,4,5,0,7,8,9,10,11,12;第第1個(gè)元素初始化為個(gè)元素初始化為0,其余未,其余未初始化的元素值自動(dòng)為初始化的元素值自動(dòng)為0行數(shù)計(jì)算出來為行數(shù)計(jì)算出來為4,不初始化時(shí)不能缺少行數(shù),不初始化時(shí)不能缺少行數(shù)n錯(cuò)誤的初始化示例錯(cuò)誤的初始化示例: :(1 1)未遵守行從左至右依次初始化
9、原則未遵守行從左至右依次初始化原則: int a43= ,4,5,6,7,8,9,10,11,12; (2 2)同一行中未遵守列從左至右依次初始化原則同一行中未遵守列從左至右依次初始化原則: : int a43=1, ,3,4,5,6,7,8,9,10,11,12; int a43=1,2,3,5,6,7,8,9,10,11,12; (3 3)不分行,用類似一維數(shù)組的方式初始化,未按順序不分行,用類似一維數(shù)組的方式初始化,未按順序: :int a43=1,2, ,4, ,6,7,8,9,10,11,12 ;(4 4)省略列號(hào)省略列號(hào): :int a4 =1,2,3,4,5,6,7,8,9,10
10、,11,12;中間缺少兩個(gè)元素,不符合中間缺少兩個(gè)元素,不符合從左到右依次的原則從左到右依次的原則第第1 1行沒有初始化,后行沒有初始化,后面行就不能初始化面行就不能初始化第第1 1行第行第2 2列沒有初始化,列沒有初始化,第第3 3列就不能初始化列就不能初始化第第2 2行第行第1 1列沒有初始化,第列沒有初始化,第2 2、3 3列就不能初始化列就不能初始化二維數(shù)組初始化中列二維數(shù)組初始化中列號(hào)一定不能省略號(hào)一定不能省略a00a00 a01a01a02a02 a10a10 a11a11 a12a12 a20a20 a21a21 a22a22 a30a30 a31a31 a420i 30 j 2
11、a0a1a2a3n二維數(shù)組元素可隨機(jī)訪問,因?yàn)槊總€(gè)元素地址可計(jì)算二維數(shù)組元素可隨機(jī)訪問,因?yàn)槊總€(gè)元素地址可計(jì)算Loc(aijLoc(aij)=)=a+(ia+(i* *m+jm+j) )* *sizeofsizeof( (二維數(shù)組元素類型)二維數(shù)組元素類型)n數(shù)組元素的表示形式:數(shù)組元素的表示形式:例:例:intint a43; a43;(1 1)最常用的是下標(biāo)(行、列)法)最常用的是下標(biāo)(行、列)法:aijaij (2 2)間接引用法與下標(biāo)法結(jié)合)間接引用法與下標(biāo)法結(jié)合: : * *( (ai+jai+j) )、 (* *( (a+ia+i) ))jj(3 3)間接引用法)間接引用法: :
12、* *( (* *( (a+i)+ja+i)+j) )n二維數(shù)組元素在內(nèi)存中的存儲(chǔ)形式二維數(shù)組元素在內(nèi)存中的存儲(chǔ)形式: :先行后列依次先行后列依次行下標(biāo)行下標(biāo)列數(shù)列數(shù)列下標(biāo)列下標(biāo)n一般要對所有的數(shù)組元素執(zhí)行同樣的操作,與一維數(shù)一般要對所有的數(shù)組元素執(zhí)行同樣的操作,與一維數(shù)組類似,用循環(huán)結(jié)構(gòu)控制,二維數(shù)組需用兩層循環(huán)組類似,用循環(huán)結(jié)構(gòu)控制,二維數(shù)組需用兩層循環(huán)例:例:intint a43,n=1; a43,n=1;for(intfor(int i=0;i4;i+) i=0;i4;i+)for(intfor(int j=0;j3;j+) j=0;j3;j+)aijaij=n+;=n+;n程序程序1
13、0.110.1 將如下所示的矩陣存入二維數(shù)組,然后照將如下所示的矩陣存入二維數(shù)組,然后照原樣輸出,最后按轉(zhuǎn)置形式輸出。原樣輸出,最后按轉(zhuǎn)置形式輸出。 算法提示算法提示:轉(zhuǎn)置輸出不需要另外定義二維數(shù)組轉(zhuǎn)置輸出不需要另外定義二維數(shù)組,只是在控制循只是在控制循環(huán)時(shí)先控制列下標(biāo)再控制行下標(biāo)環(huán)時(shí)先控制列下標(biāo)再控制行下標(biāo)動(dòng)動(dòng)態(tài)態(tài)演示演示過過程程n二維數(shù)組名二維數(shù)組名是是二維數(shù)組指針二維數(shù)組指針常量常量n如果按照遞歸的概念如果按照遞歸的概念, ,它也是特殊的一維數(shù)組指針?biāo)彩翘厥獾囊痪S數(shù)組指針 例:例:intint a43; a43; (1)(1)指針指針a a的基類型為的基類型為int3,aint3,a指
14、向指向a0,a0,即即a= =&a0,a= =&a0, 因此因此a+ia+i指向指向aiai,即:即:a+ia+i=&=&ai,ai,a+ia+i或或& &aiai 稱為稱為行指針行指針 地址計(jì)算公式為地址計(jì)算公式為: a+i=a+ i*sizeof (二維數(shù)組元素類型二維數(shù)組元素類型*列數(shù)列數(shù)) (2)(2)指針指針a aii 的基類型為的基類型為intint,aiai 指向元素指向元素ai0,ai0, 即即aiai= =&ai0,= =&ai0, 因此因此ai+jai+j指向元素指向元素aijaij,即即: : ai+jai+j= =&= =&aijaij, aiai 、* *( (a+i
15、a+i) )、ai+jai+j或或& &aijaij 稱為稱為列指針列指針或或一維指針一維指針 地址計(jì)算公式為地址計(jì)算公式為: ai+jai+j =ai+j*sizeof (二維數(shù)組元素類型二維數(shù)組元素類型)0i3n一級(jí)指針一級(jí)指針也稱為也稱為列指針列指針或或一維指針一維指針,這是一級(jí)指針在,這是一級(jí)指針在針對行指針或二維數(shù)組指針時(shí)的稱謂針對行指針或二維數(shù)組指針時(shí)的稱謂n程序程序10.210.2 二維數(shù)組行指針和列指針的區(qū)別二維數(shù)組行指針和列指針的區(qū)別提示:提示:a a與與a0a0的值雖然相等,但基類型不同,因此注意比的值雖然相等,但基類型不同,因此注意比較較a+1a+1與與a0+1a0+1的
16、不同值的不同值 (在(在VC+VC+下演示程序)下演示程序)n結(jié)論結(jié)論1 1:一個(gè)一個(gè)m m行行n n列的二維數(shù)組可以作為長度為列的二維數(shù)組可以作為長度為m m* *n n的的一維數(shù)組,一維數(shù)組,二者在內(nèi)存中的存儲(chǔ)順序一致二者在內(nèi)存中的存儲(chǔ)順序一致n程序程序10.310.3 把二維數(shù)組當(dāng)作一維數(shù)組輸出把二維數(shù)組當(dāng)作一維數(shù)組輸出 算法提示算法提示:用一層循環(huán)而不是二層循環(huán)控制,注意換行條件用一層循環(huán)而不是二層循環(huán)控制,注意換行條件動(dòng)動(dòng)態(tài)態(tài)演示演示過過程程n結(jié)論結(jié)論2 2:一個(gè)長度為一個(gè)長度為n n的一維數(shù)組可以作為的一維數(shù)組可以作為1 1行行n n列二維列二維數(shù)組數(shù)組n例如:例如:double
17、d5=1,2,3,4,5;double d5=1,2,3,4,5;n這里指針這里指針d d的基類型為的基類型為double,double,而指針而指針(& &d d)的基類型的基類型是是double5double5(參看(參看5.2.35.2.3節(jié)),相當(dāng)于節(jié)),相當(dāng)于1 1行行5 5列二維雙列二維雙浮點(diǎn)型數(shù)組指針浮點(diǎn)型數(shù)組指針 n程序程序10.410.4 一維數(shù)組可以看作行數(shù)為一維數(shù)組可以看作行數(shù)為1 1的二維數(shù)組。的二維數(shù)組。算法提示算法提示: ( & &一維數(shù)組名一維數(shù)組名) 相當(dāng)于二維數(shù)組名相當(dāng)于二維數(shù)組名動(dòng)動(dòng)態(tài)態(tài)演示演示過過程程注意:這里的注意:這里的括號(hào)不能少括號(hào)不能少n含義一:含
18、義一:整個(gè)二維數(shù)組變量空間的名稱整個(gè)二維數(shù)組變量空間的名稱, ,在執(zhí)行字節(jié)在執(zhí)行字節(jié)計(jì)算計(jì)算sizeofsizeof和取址運(yùn)算和取址運(yùn)算& &時(shí),時(shí),a a就是整個(gè)二維數(shù)組空間就是整個(gè)二維數(shù)組空間標(biāo)識(shí)符,即二維數(shù)組變量的名稱標(biāo)識(shí)符,即二維數(shù)組變量的名稱 例:例:intint a43, a43,則則a a的類型為的類型為intint 43 43sizeof(asizeof(a) )的值是的值是4848,&a+1&a+1比比&a&a大大48 48 n含義二:含義二:行一維數(shù)組指針,稱為行一維數(shù)組指針,稱為二維數(shù)組指針二維數(shù)組指針,也稱,也稱行指針行指針,因?yàn)閿?shù)組變量不能通過其名稱直接引用數(shù)組,因?yàn)?/p>
19、數(shù)組變量不能通過其名稱直接引用數(shù)組元素,因此二維數(shù)組名稱元素,因此二維數(shù)組名稱“退化退化”了,大部分時(shí)候都了,大部分時(shí)候都是這一含義。是這一含義。n二維數(shù)組要傳址,可以傳遞二維數(shù)組要傳址,可以傳遞二維數(shù)組指針二維數(shù)組指針n二維數(shù)組指針的二維數(shù)組指針的基類型基類型由由二維數(shù)組元素類型和列數(shù)二維數(shù)組元素類型和列數(shù)兩兩部分部分聯(lián)合表示聯(lián)合表示n因此,接受二維數(shù)組指針的指針變量,其基類型也應(yīng)因此,接受二維數(shù)組指針的指針變量,其基類型也應(yīng)該由兩部分聯(lián)合表示,而且對應(yīng)的部分完全一致,這該由兩部分聯(lián)合表示,而且對應(yīng)的部分完全一致,這樣的指針變量稱為樣的指針變量稱為行指針變量行指針變量 例:例:intint
20、( (* *p)p)33; ;/二級(jí)指針變量二級(jí)指針變量p p intint a4 a433=1,2,3,4,5,6,7,8,9,10,11,12;=1,2,3,4,5,6,7,8,9,10,11,12; p=a;p=a;/將二維數(shù)組指針賦值給行指針變量將二維數(shù)組指針賦值給行指針變量 此時(shí)行指針變量此時(shí)行指針變量p p等價(jià)于二維數(shù)組指針等價(jià)于二維數(shù)組指針a a,有以下等價(jià)式:有以下等價(jià)式: p+ip+i= = =a+ia+i pipi= = =aiai pijpij= = =aijaij 對應(yīng)于二維數(shù)對應(yīng)于二維數(shù)組元素類型組元素類型對應(yīng)于二維對應(yīng)于二維數(shù)組的列數(shù)數(shù)組的列數(shù)還可以:還可以:p=p
21、=a+ia+i或或p=&p=&aiai,保證保證p p得到的是行指針都是正確的得到的是行指針都是正確的此處的括號(hào)此處的括號(hào)一定要有一定要有! !n程序程序10.510.5 將給定矩陣按轉(zhuǎn)置形式輸出。將給定矩陣按轉(zhuǎn)置形式輸出。本程序與程序本程序與程序10.210.2功能類似,但作了簡化,二維數(shù)組元素功能類似,但作了簡化,二維數(shù)組元素初初始化始化給定,不需要輸出原始矩陣。給定,不需要輸出原始矩陣。本程序用本程序用DisplayDisplay函數(shù)實(shí)現(xiàn)矩陣轉(zhuǎn)置輸出函數(shù)實(shí)現(xiàn)矩陣轉(zhuǎn)置輸出重點(diǎn)理解如何用重點(diǎn)理解如何用行指針變量行指針變量作為形參接受二維數(shù)組實(shí)參。作為形參接受二維數(shù)組實(shí)參。n注意:注意:此題的
22、函數(shù)原型可以有以下三種等效表示:此題的函數(shù)原型可以有以下三種等效表示: (1 1)void Display( void Display( intint ( (* *pa)3,pa)3,int row);int row); (2 2)void Display( void Display( intint pa3, pa3,int row);int row); (3 3)void Display( void Display( intint pa43, pa43,int row);int row); 后兩種本質(zhì)上就是第一種形式,且后兩種形式只能出現(xiàn)在形后兩種本質(zhì)上就是第一種形式,且后兩種形式只能出現(xiàn)在
23、形參表中,不能作為參表中,不能作為行指針變量行指針變量的定義(或聲明)形式的定義(或聲明)形式 動(dòng)動(dòng)態(tài)態(tài)演示演示過過程程n一個(gè)一個(gè)m m行行n n列二維數(shù)組,可以看作是長度為列二維數(shù)組,可以看作是長度為m m* *n n的一維的一維數(shù)組數(shù)組, ,因此二維數(shù)組可以因此二維數(shù)組可以傳址給列指針傳址給列指針例:例:intint a43; a43; 則則a0a0(或(或&a00&a00)是指向第)是指向第1 1個(gè)二維數(shù)組元素個(gè)二維數(shù)組元素a00a00的指針常量,它等價(jià)于長度為的指針常量,它等價(jià)于長度為1212的的一維整型數(shù)組指針一維整型數(shù)組指針,該一,該一維數(shù)組的維數(shù)組的1212個(gè)元素依次為:個(gè)元素依
24、次為:a00a00、a01a01a011a011 此時(shí)存在此時(shí)存在等式等式:a0ia0i* *3+j=3+j=aijaij 因此,可以通過定義一個(gè)因此,可以通過定義一個(gè)列指針(一級(jí)指針)列指針(一級(jí)指針)變量來接受變量來接受a0a0的值,的值,例如:例如:intint * *p=a0;p=a0;則則 pipi* *3+j=3+j=aijaij n這樣,這樣,二維數(shù)組也可以通過將其起始列地址傳給一個(gè)二維數(shù)組也可以通過將其起始列地址傳給一個(gè)一級(jí)指針變量來訪問所有的元素一級(jí)指針變量來訪問所有的元素行下標(biāo)行下標(biāo)列數(shù)列數(shù)列下標(biāo)列下標(biāo)n程序程序10.610.6 尋找矩陣中的馬鞍點(diǎn)。一個(gè)矩陣中的元素,尋找矩
25、陣中的馬鞍點(diǎn)。一個(gè)矩陣中的元素,若在它所在的若在它所在的行中最小行中最小,在它所在的,在它所在的列中最大列中最大,則稱,則稱為馬鞍點(diǎn)。求一個(gè)為馬鞍點(diǎn)。求一個(gè)n n* *m m階矩陣的所有馬鞍點(diǎn)。階矩陣的所有馬鞍點(diǎn)。 算法思想:算法思想:用一個(gè)用一個(gè) n n行行m m列二維數(shù)組列二維數(shù)組a a來存儲(chǔ)矩陣,一個(gè)長度來存儲(chǔ)矩陣,一個(gè)長度為為n n的一維數(shù)組的一維數(shù)組minmin存儲(chǔ)每行中的最小元素,一個(gè)長度為存儲(chǔ)每行中的最小元素,一個(gè)長度為m m的的一維數(shù)組一維數(shù)組maxmax存儲(chǔ)每列中的最大元素。存儲(chǔ)每列中的最大元素。 尋找馬鞍點(diǎn)的具體方法是:尋找馬鞍點(diǎn)的具體方法是:用行控制外層循環(huán),在用行控制外
26、層循環(huán),在i i行其行行其行中最小元素為中最小元素為min imin i,在行固定的情況下,用列控制內(nèi)層,在行固定的情況下,用列控制內(nèi)層循環(huán),用每一列的最大元素值循環(huán),用每一列的最大元素值maxjmaxj 與當(dāng)前行的與當(dāng)前行的minimini 去比去比較,如果二者相等,則說明一個(gè)二維數(shù)組元素較,如果二者相等,則說明一個(gè)二維數(shù)組元素aijaij 就是就是馬鞍點(diǎn)。馬鞍點(diǎn)。 顯然,顯然,一個(gè)矩陣中可能不止一個(gè)馬鞍點(diǎn),也有可能沒有馬鞍一個(gè)矩陣中可能不止一個(gè)馬鞍點(diǎn),也有可能沒有馬鞍點(diǎn)。馬鞍點(diǎn)元素加括號(hào)輸出。點(diǎn)。馬鞍點(diǎn)元素加括號(hào)輸出。動(dòng)動(dòng)態(tài)態(tài)演示演示過過程程n所謂所謂一維指針數(shù)組,一維指針數(shù)組,就是數(shù)組元
27、素為就是數(shù)組元素為一級(jí)指針變量一級(jí)指針變量的的一維數(shù)組。一維數(shù)組。例:例:charchar* * a5; a5; a a是長度為是長度為5 5的一維字符型指針數(shù)組,的一維字符型指針數(shù)組,a a是指針常量是指針常量,一維數(shù),一維數(shù)組元素組元素a0a0、a1a1、a2a2、a3a3、a4a4都是一級(jí)字符型指都是一級(jí)字符型指針變量,它們各自可以指向一維字符數(shù)組,特別是字符串針變量,它們各自可以指向一維字符數(shù)組,特別是字符串 對每個(gè)元素(一級(jí)指針變量)都可以賦值對每個(gè)元素(一級(jí)指針變量)都可以賦值:a0=File; a0=File; a1=Edit; a2=Compile; a3=Run; a1=Ed
28、it; a2=Compile; a3=Run; a4=Tools; a4=Tools; 也可以在定義一維指針數(shù)組時(shí)進(jìn)行初始化,如普通一維數(shù)組也可以在定義一維指針數(shù)組時(shí)進(jìn)行初始化,如普通一維數(shù)組 charchar* * a5= a5=File,Edit,Compile,Run,ToolsFile,Edit,Compile,Run,Tools; 或或charchar* * a= a=File,Edit,Compile,Run,ToolsFile,Edit,Compile,Run,Tools;注意:注意:此處不能加括號(hào):而此處不能加括號(hào):而char(char(* *a)5a)5是是1 1個(gè)行指針定義
29、個(gè)行指針定義n一維指針數(shù)組名可以賦值給何種類型的變量?一維指針數(shù)組名可以賦值給何種類型的變量?回顧:回顧:一級(jí)指針變量與一維數(shù)組的關(guān)系一級(jí)指針變量與一維數(shù)組的關(guān)系Type Type arraysizearraysize ;/數(shù)組數(shù)組arrayarray的元素類型為的元素類型為TypeType ,即,即數(shù)組指針的基類型為數(shù)組指針的基類型為TypeTypeTypeType* * p; p; /指針變量指針變量p p的基類型為的基類型為TypeType因此:因此:p=array;p=array; / /指針變量指針變量p p指向數(shù)組指向數(shù)組arrayarray 如果有指針數(shù)組定義如果有指針數(shù)組定義:
30、charchar* * a5 a5,則數(shù)組,則數(shù)組a a的元素類型是的元素類型是charchar* *,即數(shù)組指針常量,即數(shù)組指針常量a a的基類型是的基類型是charchar* *,則接受則接受a a值的指值的指針變量的基類型也應(yīng)該是針變量的基類型也應(yīng)該是charchar* *,故該指針變量類型是故該指針變量類型是charchar* * *,稱為(字符型),稱為(字符型)指針的指針指針的指針,也稱,也稱二級(jí)指針二級(jí)指針 于是:于是:char char * * *pa=a;pa=a;這時(shí),這時(shí),paipai 與與aiai 等效等效,都是指向某一個(gè)字符串的首地址,都是指向某一個(gè)字符串的首地址pa
31、pa為二級(jí)為二級(jí)指針變量指針變量a a為一維指為一維指針數(shù)組名針數(shù)組名n程序程序10.710.7 主函數(shù)中定義指針數(shù)組處理多個(gè)字符串,函數(shù)以主函數(shù)中定義指針數(shù)組處理多個(gè)字符串,函數(shù)以指針指針的指針為形參的指針為形參輸出所有字符串的值。輸出所有字符串的值。輸出函數(shù)原型輸出函數(shù)原型:void Display( void Display( charchar* * * papa,int,int n) n);另一種形式另一種形式:void void Display(Display(charchar* * pa , pa ,intint n); n);n二級(jí)指針、一級(jí)指針與普通變量的關(guān)系:二級(jí)指針、一級(jí)指
32、針與普通變量的關(guān)系:例例: : char char chch=A;=A;/定義一個(gè)普通字符型變量定義一個(gè)普通字符型變量charchar* * p=& p=&chch; ; /一維指針變量一維指針變量p p指向了變量指向了變量chchcharchar* * * q=&p; q=&p; /二級(jí)指針變量二級(jí)指針變量q q指向了一級(jí)指針指向了一級(jí)指針p p則對字符值的訪問形式有等效的則對字符值的訪問形式有等效的3 3種形式:種形式:chch、* *p p、* * *q,q,如下圖所示如下圖所示動(dòng)動(dòng)態(tài)態(tài)演示演示過過程程這種形式的形參本質(zhì)這種形式的形參本質(zhì)上就是上就是charchar* * * pa pa
33、q qp pchch0 x12ff78 0 x12ff78 0 x12ff7c 0 x12ff7c A A&p&p& &chch* *p p、* * *q qn一維指針數(shù)組一維指針數(shù)組是元素為一級(jí)指針變量的一維數(shù)組。每是元素為一級(jí)指針變量的一維數(shù)組。每一個(gè)一級(jí)指針變量可以分別指向長度不同、且彼此空一個(gè)一級(jí)指針變量可以分別指向長度不同、且彼此空間不相鄰的一維數(shù)組。間不相鄰的一維數(shù)組。n二維數(shù)組二維數(shù)組是元素為一級(jí)指針常量的一維數(shù)組。每一個(gè)是元素為一級(jí)指針常量的一維數(shù)組。每一個(gè)指針常量分別指向長度相同、彼此空間相鄰的一維數(shù)指針常量分別指向長度相同、彼此空間相鄰的一維數(shù)組,組,例:例: char c
34、har cColor47=“cColor47=“white”,”red”,”orange”,”pinwhite”,”red”,”orange”,”pink k”;”; char char * *pColor4= pColor4= “white”,”red”,”orange”,”pinkwhite”,”red”,”orange”,”pink”;”; cColorcColor是二維數(shù)組,其元素為是二維數(shù)組,其元素為cColor0cColor3,cColor0cColor3,它們它們都是都是長度為長度為7 7的字符型一維數(shù)組的字符型一維數(shù)組,且在內(nèi)存中連續(xù)存放,且在內(nèi)存中連續(xù)存放 pColorpCo
35、lor是一維指針數(shù)組,其元素為是一維指針數(shù)組,其元素為pColor0pColor3,pColor0pColor3,它們都是它們都是一級(jí)指針變量一級(jí)指針變量,可以指向各獨(dú)立存放的串首地址,可以指向各獨(dú)立存放的串首地址w wh hi it te e 00r re ed d00o or ra an ng ge e00p pi in nk k00cColorcColorcColor0cColor0cColor1cColor1cColor2cColor2cColor3cColor3pColorpColorpColor0pColor0pColor1pColor1pColor2pColor2pColor3p
36、Color3white0white0red0red0orange0orange0pink0pink0這這4 4個(gè)個(gè)字符串字符串長度相長度相等地址等地址相鄰相鄰這這4 4個(gè)字符串個(gè)字符串長度不相等長度不相等地址不一定地址不一定相鄰相鄰多個(gè)字符串的處理,既可以用二維字多個(gè)字符串的處理,既可以用二維字符數(shù)組,又可以用一維指針數(shù)組,后符數(shù)組,又可以用一維指針數(shù)組,后者是更常用的處理方式。者是更常用的處理方式。 n指針數(shù)組的每一個(gè)元素作為指針變量,可以指向二維指針數(shù)組的每一個(gè)元素作為指針變量,可以指向二維數(shù)組的行數(shù)組,當(dāng)然,要保證基類型的一致性。數(shù)組的行數(shù)組,當(dāng)然,要保證基類型的一致性。n前面的例示中,
37、可以用以下循環(huán)實(shí)現(xiàn)賦值:前面的例示中,可以用以下循環(huán)實(shí)現(xiàn)賦值:nfor (i=0;i4;i+)for (i=0;i4;i+)n pColoripColori=cColoricColori; ; n程序程序10.810.8 指針數(shù)組和二維數(shù)組。指針數(shù)組和二維數(shù)組。 用二維整型數(shù)組存儲(chǔ)一個(gè)矩陣,能過一維指針數(shù)組輸出矩陣用二維整型數(shù)組存儲(chǔ)一個(gè)矩陣,能過一維指針數(shù)組輸出矩陣n指針數(shù)組的元素是指針變量,不僅可以指向靜態(tài)數(shù)組指針數(shù)組的元素是指針變量,不僅可以指向靜態(tài)數(shù)組n也可以指向動(dòng)態(tài)數(shù)組也可以指向動(dòng)態(tài)數(shù)組 例:例:intint* * p4 p4,i;i; for (i=0;i4;i+) for (i=0
38、;i4;i+) pipi=( (intint* *)malloc(3)malloc(3* *sizeof(intsizeof(int);); 動(dòng)動(dòng)態(tài)態(tài)演示演示過過程程n一級(jí)指針可以申請動(dòng)態(tài)一維數(shù)組空間,同理,一級(jí)指針可以申請動(dòng)態(tài)一維數(shù)組空間,同理,二級(jí)指二級(jí)指針可以申請動(dòng)態(tài)二維數(shù)組空間針可以申請動(dòng)態(tài)二維數(shù)組空間,需要分兩步走:,需要分兩步走:n用二級(jí)指針申請動(dòng)態(tài)二維數(shù)組的方法是:用二級(jí)指針申請動(dòng)態(tài)二維數(shù)組的方法是: (1 1)首先用二級(jí)指針申請一維指針數(shù)組空間,指針數(shù)組的)首先用二級(jí)指針申請一維指針數(shù)組空間,指針數(shù)組的長度就是動(dòng)態(tài)二維數(shù)組的行數(shù);長度就是動(dòng)態(tài)二維數(shù)組的行數(shù); (2 2)接著用這
39、些一級(jí)指針變量分別申請動(dòng)態(tài)一維數(shù)組空間,)接著用這些一級(jí)指針變量分別申請動(dòng)態(tài)一維數(shù)組空間,其元素個(gè)數(shù)就是動(dòng)態(tài)二維數(shù)組的列數(shù)。其元素個(gè)數(shù)就是動(dòng)態(tài)二維數(shù)組的列數(shù)。n釋放動(dòng)態(tài)二維數(shù)組空間的方法是釋放動(dòng)態(tài)二維數(shù)組空間的方法是( (與申請順序相反與申請順序相反):): (1 1)用一層循環(huán)首先釋放所有由一級(jí)指針?biāo)暾埖膭?dòng)態(tài)空)用一層循環(huán)首先釋放所有由一級(jí)指針?biāo)暾埖膭?dòng)態(tài)空間間先釋放二維數(shù)組元素空間先釋放二維數(shù)組元素空間 (2 2)再直接通過二級(jí)指針變量釋放一維指針數(shù)組空間)再直接通過二級(jí)指針變量釋放一維指針數(shù)組空間后釋放一維指針數(shù)組的空間后釋放一維指針數(shù)組的空間array00 array01 array
40、02n程序程序10.910.9 通過二級(jí)指針變量通過二級(jí)指針變量arrayarray申請了申請了rowrow行行colcol列的動(dòng)態(tài)列的動(dòng)態(tài)二維數(shù)組空間,二維數(shù)組的元素為二維數(shù)組空間,二維數(shù)組的元素為099099之間的隨機(jī)數(shù)。最后以之間的隨機(jī)數(shù)。最后以矩陣形式輸出該動(dòng)態(tài)二維數(shù)組。矩陣形式輸出該動(dòng)態(tài)二維數(shù)組。 關(guān)鍵語句:關(guān)鍵語句:intint * * *arrayarray,row,colrow,col; ; array=(array=(intint * * *) )malloc(rowmalloc(row* *sizeof(intsizeof(int * *); ); for (i=0;ifo
41、r (i=0;irow;irow;i+) +) arrayiarrayi=(=(intint * *) )malloc(colmalloc(col* *sizeof(intsizeof(int); ); 現(xiàn)在:現(xiàn)在:arrayijarrayij 就與靜態(tài)數(shù)組元素一樣進(jìn)行訪問了就與靜態(tài)數(shù)組元素一樣進(jìn)行訪問了動(dòng)動(dòng)態(tài)態(tài)演示演示過過程程申請一維指針數(shù)組空間申請一維指針數(shù)組空間, ,該該數(shù)組含數(shù)組含rowrow個(gè)元素個(gè)元素再用這再用這rowrow個(gè)一級(jí)指針分別申個(gè)一級(jí)指針分別申請請colcol個(gè)二維數(shù)組元素空間個(gè)二維數(shù)組元素空間arrayarrayarray0array0array1array1arra
42、y10 array11 array12若若row=2row=2,一維指針數(shù)組空間,一維指針數(shù)組空間, ,該數(shù)組含該數(shù)組含2 2個(gè)一級(jí)指針元素個(gè)一級(jí)指針元素若若colcol=3=3,這是,這是array0array0申請申請的一維整型數(shù)組的一維整型數(shù)組, ,該數(shù)組含該數(shù)組含3 3個(gè)個(gè)intint型元素型元素若若colcol=3=3,這是,這是array1array1申請申請的一維整型數(shù)組的一維整型數(shù)組, ,該數(shù)組含該數(shù)組含3 3個(gè)個(gè)intint型元素型元素這這6 6個(gè)便是用二級(jí)指針申個(gè)便是用二級(jí)指針申請的動(dòng)態(tài)二維數(shù)組元素請的動(dòng)態(tài)二維數(shù)組元素下表總結(jié)了第下表總結(jié)了第5 5章所講的一級(jí)指針與一維數(shù)組
43、、本章所講的行列指針與章所講的一級(jí)指針與一維數(shù)組、本章所講的行列指針與二維數(shù)組,指針數(shù)組及指針的指針之間的關(guān)系。二維數(shù)組,指針數(shù)組及指針的指針之間的關(guān)系。指針名稱指針名稱指針定義舉例指針定義舉例數(shù)組定義舉例數(shù)組定義舉例 可進(jìn)行的賦值可進(jìn)行的賦值基類型基類型一級(jí)指針一級(jí)指針( (列指針列指針) )int *p;int a10;int m=2;int a43;p=a; p=a+i; p=&ai;p=&m;p=*a; p=ai;p=*(a+i);int行指針行指針int (*p)3;int a43;int arr3;p=a; p=a+i; p=&ai;p=&arr;int3二級(jí)指針二級(jí)指針int *
44、p;int *a3;p=a; p=a+i; p=&ai;int *指針數(shù)組指針數(shù)組int *p4;char *s4;int a43;char b47=”white”,”red”,yellow”,”green”;pi=ai;Si=bi;int *char*n二維數(shù)組中的行列指針及相互轉(zhuǎn)化二維數(shù)組中的行列指針及相互轉(zhuǎn)化例例: :intint a43; a43;則行指針有則行指針有: :a a、a+ia+i、& &aiai 列指針有:列指針有:* *a a、* *( (a+ia+i) )、aiai 、ai+jai+j、 & &aijaij 轉(zhuǎn)化方法:轉(zhuǎn)化方法:行變列,加行變列,加* *號(hào);列變行,取址號(hào);列變行,取址& &n這種轉(zhuǎn)化方法與一維數(shù)組元素與其地址的相互轉(zhuǎn)化規(guī)則一樣!這種轉(zhuǎn)化方法與一維數(shù)組元素與其地址的相互轉(zhuǎn)化規(guī)則一樣!(地址到值,加(地址到值,加* *號(hào);值到地址,取址號(hào);值
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 慢性阻塞性肺部疾病課件
- 保障交易安全的支付系統(tǒng)構(gòu)建
- 2025年漯河a2貨運(yùn)資格證模擬考試
- 辦學(xué)場地租賃合同協(xié)議書
- 企業(yè)法律合規(guī)指南
- 三農(nóng)產(chǎn)品產(chǎn)地與流通標(biāo)準(zhǔn)化體系建設(shè)手冊
- 東京中城區(qū)域規(guī)劃案例分析報(bào)告43
- 2025年蚌埠經(jīng)濟(jì)技術(shù)職業(yè)學(xué)院單招職業(yè)技能考試題庫往年題考
- 農(nóng)民專業(yè)合作社股權(quán)轉(zhuǎn)讓協(xié)議
- 任務(wù)5.1.2 水平距離放樣
- 廣東省佛山市《綜合基礎(chǔ)知識(shí)》事業(yè)單位國考真題
- 02 第2章 城市與城市化-城市管理學(xué)
- 六年級(jí)上冊英語教案-Culture 2 Going Green 第二課時(shí) 廣東開心英語
- 警察叔叔是怎樣破案的演示文稿課件
- 2019石景山初三一模語文試題及答案
- 外固定架課件
- 尿液有形成分形態(tài)學(xué)檢查與臨床意義課件
- 09式 新擒敵拳 教學(xué)教案 教學(xué)法 圖解
- CAD術(shù)語對照表
- 《橋梁工程計(jì)算書》word版
- 學(xué)術(shù)論文的寫作與規(guī)范課件
評論
0/150
提交評論