




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第6章 指針6.4 指針與數(shù)組及字符串 6.5 指針數(shù)組和多級指針 6.4 指針與數(shù)組及字符串6.4.1 指針與數(shù)組 C語言中,指針和數(shù)組之間的關(guān)系十分密切,它們都可以處理內(nèi)存中連續(xù)存放的一系列數(shù)據(jù),數(shù)組與指針在訪問內(nèi)存時采用統(tǒng)一的地址計算方法。數(shù)組內(nèi)部的處理就是依賴于指針運算來實現(xiàn)的。 數(shù)組是相同數(shù)據(jù)類型的數(shù)據(jù)集合、數(shù)組用其下標變化實現(xiàn)對內(nèi)存中的數(shù)組元素進行處理。 例如,程序中說明了一個數(shù)組:int a10; 編譯系統(tǒng)在一定的內(nèi)存區(qū)域為該數(shù)組分配了存放int型(字節(jié))數(shù)據(jù)的個連續(xù)存儲空間,它們分別是a0, a1,,a9。用ai表示從數(shù)組存儲首地址開始的第i+1個元素變量。1/1若程序中同時說
2、明了一個int型指針: int *pa;并且通過指針賦值運算: pa=a; 或pa=&a0;指針pa就指向了數(shù)組a的首地址。這時指針的目標變量*pa就是a0。 指針pa+1的目標變量*(pa+1)就是a1, *(pa+2)就是a2 *(pa+i)就是ai,如下圖所示:4/5例6.5 指針與數(shù)組的關(guān)系#include void main() int a10, *pa, i; for (i = 0; i 10; i+) ai = i + 1; / 將指針指向數(shù)組的第一個元素 pa = a; /建立指向數(shù)組的指針pa for (i = 0; 10; i+) printf(*(pa+%d):%dn,
3、i, *(pa + i) ); / 用指針的形式逐個輸出數(shù)組元素內(nèi)容運行結(jié)果:* (pa+0):1* (pa+1):2* (pa+2):3* (pa+3):4* (pa+4):5* (pa+5):6* (pa+6):7* (pa+7):8* (pa+8):9* (pa+9):10程序中第一個for循環(huán)是把1-10賦予數(shù)組元素a0-a9。然后通過pa=a; 使指針指向數(shù)組。再用第二個for循環(huán),通過指針運算輸出顯示數(shù)組中的數(shù)據(jù)。3/8(1)上述表現(xiàn)形式ai和*(pa+i)實質(zhì)上是兩個運算表達式,它們遵循統(tǒng)一的地址計算規(guī)則實現(xiàn)相同的功能。 (2)當指針pa指向數(shù)組a時,就可以用ai、*(pa+i)
4、、*(a+i)和pai等四種形式來訪問數(shù)組的元素,都是完成同樣功能的表達式。(3)在程序中它們可以互換使用,恰當?shù)厥褂弥羔樑c數(shù)組表現(xiàn)形式的互換性,可以使程序表現(xiàn)形式更簡潔。 3/11元素ai的地址表示:a+i故*(a+i)等價于ai運算符稱為變址運算符數(shù)組名是基址,下標是偏移量即:數(shù)組名偏移*(基址+偏移)二者等價兌換例6.6 指針和數(shù)組表現(xiàn)形式的互換性#include void main( ) int i,*pa; int a=2,4,6,8,10; pa=a; /建立指針 /指針采用數(shù)組的形式使用 for (i=0 ; i5 ; i+) printf (”a%d:%d ”, i , ai
5、); printf (”n”);/數(shù)組采用指針的形式使用 for(i=0 ; i5 ; i+) printf (”*(pa+%d):%d”, i , *(pa+i) ); printf (”n”);a i*(pa+i)運行結(jié)果:a0:2 a1:4 a2:6 a3:8 a4:10*(pa+0):2 *(pa+1):4 *(pa+2):6 *(pa+3):8 *(pa+4):10 指針加下標和數(shù)組名加下標在訪問地址空間中的數(shù)據(jù)時,其表現(xiàn)形式具有相同的意義,這是因為指針和數(shù)組名都是地址量。 a i*(pa+i)pai*(a+i)3/14特別注意: 指針和數(shù)組在訪問地址中的數(shù)據(jù)時,其表現(xiàn)形式具有相同的
6、意義,但是,指針和數(shù)組名在本質(zhì)上是不同的:指針是地址變量,而數(shù)組名是地址常量, 區(qū)別在于能否作為左值。對于指針pa和數(shù)組名a。 pa = a; pa+, pa- ,&pa/正確 a+,a- ,&a /錯誤。 ai可以轉(zhuǎn)換成 *(pa + i)的前提是指針pa指向了數(shù)組a ,即pa指向數(shù)組a的第一個元素,否則不能轉(zhuǎn)換 。但ai可以用*(a+i)來等價。2/16除了用ai,*(a+i),pai,*(pa+i)來表示數(shù)組元素外,還有一種表示方法:*pa+因此,一旦建立了指向數(shù)組的指針pa,共有5種表示方法6.4.2 字符指針與字符串 C語言使用char型數(shù)組保存字符串??梢杂脭?shù)組名+下標來處理字符數(shù)
7、組中的字符串,也可以用字符型的指針來處理。 在字符串的處理中,使用字符指針比使用字符型數(shù)組加下標有更大的便利性。(1) 在字符指針初始化時,可以直接用字符串常量作為初始值。例如, char *pa=”ABC”;(2) 在程序中也可以直接把一個字符串常量賦予一個指針。例如, char *p; p=”c program”; 這里2例都是用指針指向常量數(shù)據(jù)區(qū)的字符串,故通過指針能進行的操作只有間接讀操作,不能寫操作!到底給指針變量pa和p賦了什么值?是字符串文字量嗎?不是! pa的值是存放A的內(nèi)存字節(jié)單元地址,即“ABC”存儲區(qū)域的入口地址到底給指針變量pa和p賦了什么值?是字符串文字量嗎? 6/2
8、2例6.8 向字符指針賦予字符串程序。#include void main( ) char *s=”good”; char *p; while(*s!=0) printf(”%c”,*s+); printf(”n”); p=”morning”; while(*p!=0) printf(”%c”,*p+); printf(”n”);scanf( )和printf( )函數(shù)使用字符指針輸入或輸出字符串。這時的轉(zhuǎn)換說明符使用%s,輸入項和輸出項都使用指針名。指針名的含義分別為保存鍵盤輸入字符串的內(nèi)存單元入口地址和輸出到屏幕的字符串其存儲單元的入口地址。設(shè)p是一個有確定指向的字符指針,則輸入字符串時使
9、用形式是: scanf(”%s”,p);/gets(p);輸出字符串時使用形式是: printf(”%s”,p);/puts(p);存放字符串”good”的幾種形式:1、存放在常量內(nèi)存區(qū)2、定義一個字符數(shù)組存放字符串3、用malloc()/new在堆數(shù)據(jù)區(qū) 分配內(nèi)存空間保存字符串scanf不能用指向常量區(qū)的指針 5/27puts(s);printf(“%s”,s);puts(p);printf(“%s”,p);6.5 指針數(shù)組和多級指針先回顧一下二維數(shù)組a的降維概念了解降維過程中存在多個不同類型的指針:a和ai 1/28二維數(shù)組的邏輯結(jié)構(gòu)圖如下:a00a01a02a03a10a11a12a13
10、a20a21a22a23a0a1a2a+0a+2a+1ai*(a+i)aij*(*(a+i)+j)不是*(*(a+i+j) 3/316.5 指針數(shù)組和多級指針6.5.1 指針數(shù)組 一系列有次序的指針變量集合成指針數(shù)組,其每一個元素都是一個指針變量,相當于多個指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組的說明形式如下:存儲類型 目標數(shù)據(jù)類型 *指針數(shù)組名元素個數(shù); 和普通數(shù)組一樣,編譯系統(tǒng)在處理指針數(shù)組定義時,按照指定的存儲類型為它在內(nèi)存的相應(yīng)數(shù)據(jù)區(qū)中分配一定的存儲空間,這時指針數(shù)組名就表示該指針數(shù)組的存儲首地址。 例如,有下列的自動指針數(shù)組定義: auto int *p3; 2/33 在程序中,指針數(shù)
11、組可以用來處理多維數(shù)組。例如,程序中有一個二維數(shù)組,其說明如下: int a23;采用降低維數(shù)的方法,這個二維數(shù)組可以分解為a0和a12個一維數(shù)組,它們各有3個元素。若同時存在一個指針數(shù)組: int *pa2;它由兩個指針pa0和pa1組成,并對其進行賦值:pa0=a0;或pa0=&a00; pa1=a1;或pa1=&a10; 2/35則兩個指針分別指向了兩個一維數(shù)組的入口元素,這時通過兩個指針就可以對二維數(shù)組中的數(shù)據(jù)進行處理。 如下圖: 3/38例6.9 用指針數(shù)組處理二維數(shù)組的數(shù)據(jù)#include void main( ) int data23, *pdata2; int i,j; /二維
12、數(shù)組賦值 for (i=0 ; i2 ; i+) for (j=0 ; j3 ; j+) dataij= (i+1) *(j+1); /將指針數(shù)組的各個元素指向降維后的 /一維數(shù)組 pdata0=data0; pdata1=data1; /采用指針數(shù)組輸出數(shù)組內(nèi)容 for ( i=0 ; i2 ; i+) for ( j=0 ; j3 ; j+ , pdatai+) printf (”data%d%d:%2dn”,i,j, *pdata i); 運行結(jié)果:data00:1data01:2data02:3data10:2data11:4data12:6在程序中, dataij pdataij *
13、(datai+j) *(pdatai+j) *(*(data+i)+j) *(*(pdata+i)+j)*pdatai+是意義相同的表示方法。指針數(shù)組在定義的同時可以進行初始化。應(yīng)該記住,不能用auto型變量的地址去初始化內(nèi)部的static型指針。因為初始化的時機! 7/45例6.11 字符指針數(shù)組的初始化#include void main( ) /指針數(shù)組初始化 static char * monthname = illegal month,January,February, March,April, June,July,August,September October,November,
14、December; int month; /無限循環(huán),由循環(huán)體中的break語句退出循環(huán) while (1) printf (Enter month No.: ); scanf (%d,&month); /輸入月份 if (month12) /月份錯誤,退出循環(huán) printf (Month No.%d-%sn,month, monthname 0); break; /打印月份對應(yīng)的英文名稱 printf (Month No.%d-%sn,month, monthname month); while循環(huán)為無限循環(huán),當輸入的整數(shù)不在1-12的范圍內(nèi)時,用break語句退出循環(huán)。注意字符串常量的存放
15、位置及不可修改的處理特性 3/48例6.12 多個字符串按字母遞增方式排序#include #include void main() / 指針數(shù)組初始化 char *pstr = test, capital, index, large, small ; int a, b, n = 5; / 采用直接選擇法進行排序 for (a = 0; a n - 1; a+) for (b = 0; b 0 ) char * temp; temp = pstrb; pstrb = pstrb+1; pstrb+1 = temp; for (a = 0; a 5; a+) / 輸出排序后的字符串 printf
16、(%sn, pstra);運行結(jié)果:capitalindexlargesmalltest在程序中,調(diào)用了標準函數(shù)字符串比較函數(shù):int strcmp (char *s1,char *s2 )其中s1,s2是要比較的兩個字符串的指針。當字符串s1大于、等于或小于s2時,函數(shù)返回值分別是正數(shù),零和負數(shù)。If語句中能否用strcpy實現(xiàn)字符串的拷貝?參考下圖思考改成交換法 5/53 2/55 6.5.2 多級指針 在C語言中,指針數(shù)組也可以用另外一個指針處理。例如,有一字符指針數(shù)組str3,它說明如下:char *name4= ”TurboC”,”BorlandC+”,”Access”,”; 它的三
17、個元素name0, name1和name2都是指針,分別指向一個字符串。如果同時存在另一個指針變量pp,并且把指針數(shù)組的首址賦予指針pp:pp=name或pp=&name0 pp就指向了指針數(shù)組name 。這時pp的目標變量*pp就是name0, *(pp+1)就是name1,*(pp+2)就是name2。pp就是指向指針型數(shù)據(jù)的指針變量。 5/60 二級指針的說明形式如下:存儲類型 目標數(shù)據(jù)類型 *指針名; 例如,一個二級指針pp的說明如下: auto char *pp; 二級指針說明中,存儲類型是二級指針本身的存儲類型,而數(shù)據(jù)類型是最終目標變量,即處理數(shù)據(jù)的數(shù)據(jù)類型。所以,上述定義中指明了
18、 *pp是char型。 2/62例6.13 二級指針處理多個字符串#include #define Null 0void main() char *pp; /指針數(shù)組的賦初值 char *name = Turbo C+, BorlandC+, Access, ; pp = name; / 將二級指針指向指針數(shù)組的首地址 while ( *pp != Null ) / 是空字符串,終止循環(huán) printf(%sn, *pp+); / 采用二級指針輸出字符串運行結(jié)果:Turbo C+BorlandC+Accessstrlen(*pp)!=0!(strcmp(*pp,“”)=0)用空串做循環(huán)終結(jié)不是最
19、佳方法,見演示案例 8/70例6.14多級指針應(yīng)用#include char *str = ”enter”,”lamp”,”point”,”first”; /一級指針數(shù)組聲明及初始化char *p = str+3,str+2, str+1,str; /二級指針數(shù)組聲明及初始化char *pp=p; /三級指針聲明及初始化void main( ) printf(”%s”,*+pp); printf(”%s”,*-*+pp+3); printf(”%s”,*pp-2+3); printf(”%s”,pp-11+1);運行結(jié)果:pointerstamp多級指針功能較強,但使用起來比較復(fù)雜,缺乏易讀性,容易出錯!
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小課題研究申報書
- 上虞勞動合同范本
- 血脂管理課題申報書范文
- 南京房子合同范本
- 供暖商務(wù)合同范本
- 課題研究申報書范例圖表
- 朗讀課題立項申報書
- pos機銷售合同范本
- 沖鋒舟租賃合同范本
- 教改課題申報書范文醫(yī)學
- 硝酸鎂法制取濃硝酸
- PFMEA-失效模式分析案例
- 2023年高考語文全國甲卷作文深度解析及范文 課件31張
- 國家藥監(jiān)局醫(yī)療器械技術(shù)審評檢查大灣區(qū)分中心第二批員額制人員公開招聘(2023年)模擬預(yù)測(共1000題)筆試備考題庫及答案解析
- Unit+6+Lesson+3+The+Superhero+Behind+Superman+課件高中英語北師大版(2019)必修第二冊+
- 地面貼磚工藝施工規(guī)范及驗收標準
- 血液凈化標準操作規(guī)程(SOP)血液灌流操作
- Unit 1 Whats the matter 單元測試題及答案(含聽力MP3)
- 2023年棗莊科技職業(yè)學院單招綜合素質(zhì)模擬試題及答案解析
- 化工企業(yè)安全生產(chǎn)教育培訓計劃及內(nèi)容
- GB/T 9535-1998地面用晶體硅光伏組件設(shè)計鑒定和定型
評論
0/150
提交評論