山西財(cái)經(jīng)大學(xué)C語(yǔ)言程序設(shè)計(jì)第6章指針和引用的課件_第1頁(yè)
山西財(cái)經(jīng)大學(xué)C語(yǔ)言程序設(shè)計(jì)第6章指針和引用的課件_第2頁(yè)
山西財(cái)經(jīng)大學(xué)C語(yǔ)言程序設(shè)計(jì)第6章指針和引用的課件_第3頁(yè)
山西財(cái)經(jīng)大學(xué)C語(yǔ)言程序設(shè)計(jì)第6章指針和引用的課件_第4頁(yè)
山西財(cái)經(jīng)大學(xué)C語(yǔ)言程序設(shè)計(jì)第6章指針和引用的課件_第5頁(yè)
已閱讀5頁(yè),還剩52頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、本章導(dǎo)讀 指針是C 語(yǔ)言中的一個(gè)重要的概念,也是C 語(yǔ)言的一個(gè)重要特色。正確而靈活地運(yùn)用它,可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);能動(dòng)態(tài)分配內(nèi)存;能方便地使用字符串;有效而方便地使用數(shù)組,能直接處理內(nèi)存地址等,這對(duì)設(shè)計(jì)系統(tǒng)件是很必要的。掌握指針的應(yīng)用,可以使程序簡(jiǎn)潔、緊湊、高效。每一個(gè)學(xué)習(xí)和使用C 語(yǔ)言的人,都應(yīng)當(dāng)深入地學(xué)習(xí)和掌握指針??梢哉f(shuō),不掌握指針就不掌握C的精華。 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本書目錄第6章 指針與引用本章主要知識(shí)點(diǎn) (1) 關(guān)于指針的C程序?qū)嵗?(2) 指針 (3)指針與數(shù)組 (4) 指針與函數(shù)(5) 多級(jí)指針與指針數(shù)組 (6) 內(nèi)存管理 (7)引用

2、第6章 指針與引用 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本章導(dǎo)讀 6.2 指針 6.3 指針與數(shù)組 6.5 多級(jí)指針與指針數(shù)組 6.4 指針與函數(shù) 6.1 關(guān)于指針的C程序?qū)嵗?.6 引用6.7 內(nèi)存管理 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本章目錄6.1.1 C程序?qū)嵗?.1 關(guān)于指針的C程序?qū)嵗?C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄2. C程序?qū)嵗?2)1. C程序?qū)嵗?1)6.1.1 C程序?qū)嵗?.1.1 C程序?qū)嵗?) C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄1.C程序?qū)嵗?【例6.1】指針變量的定義

3、示例。 /*程序名為l5_1.cpp */*程序功能:驗(yàn)證指針變量的定義*/ main() int num_int=12, *p_int; /*定義一個(gè)指向int型數(shù)據(jù)的指針變量p_int */ float num_f=3.14, *p_f; /*定義一個(gè)指向float型數(shù)據(jù)的指針變量p_f */ char num_ch=p, *p_ch; /*定義一個(gè)指向char型數(shù)據(jù)的指針變量p_ch */ p_int=&num_int; /*取變量num_int的地址,賦值給p_int */ p_f=&num_f; /*取變量num_f的地址,賦值給p_f */ p_ch=&num_ch; /*取變量n

4、um_ch的地址,賦值給p_ch */ printf(“num_int=%d, *p_int=%dn”, num_int, *p_int); printf(“num_f=%4.2f, *p_f=%4.2fn”, num_f, *p_f); printf(“num_ch=%c, *p_ch=%cn”, num_ch, *p_ch); 程序運(yùn)行結(jié)果:num_int=12, *p_int=12num_f=3.14, *p_f=3.14num_ch=p, *p_ch=p程序演示例6.1程序演示單擊運(yùn)行輸入源程序彈出運(yùn)行結(jié)果窗口返回例題返回本節(jié)目錄6.1.1 C程序?qū)嵗?) C語(yǔ)言程序設(shè)計(jì) (Visu

5、al C+ 6.0環(huán)境)2.C程序?qū)嵗?【例6.2】輸入2個(gè)整數(shù),按升序(從小到大排序)輸出。/*程序名為l5_2.cpp */*程序功能:使用指針變量求解2個(gè)整數(shù)的升序輸出*/main() int num1,num2; int *num1_p=&num1, *num2_p=&num2, *pointer; printf(“Input the first number: ”); scanf(“%d”,num1_p); printf(“Input the second number: ”); scanf(“%d”,num2_p); printf(“num1=%d, num2=%dn”, num1

6、, num2); if( *num1_p *num2_p ) /*如果num1num2,則交換指針*/ pointer= num1_p; num1_p= num2_p; num2_p=pointer; printf(“min=%d, max=%dn”, *num1_p, *num2_p); 程序運(yùn)行情況:Input the first number:9Input the second number:6num1=9, num2=6min=6, max=9返回本節(jié)目錄程序演示例6.2程序演示單擊運(yùn)行輸入源程序彈出運(yùn)行結(jié)果窗口返回例題返回本節(jié)目錄 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返

7、回本章目錄6.2.2 指向變量的指針變量6.2.1 地址和指針的概念6.2 指針 6.2.1 地址和指針的概念 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)1.內(nèi)存地址內(nèi)存中存儲(chǔ)單元的編號(hào)2.變量地址系統(tǒng)分配給變量的內(nèi)存單元的起始地址 (1)計(jì)算機(jī)硬件系統(tǒng)的內(nèi)存儲(chǔ)器中,擁有大量的存儲(chǔ)單元(每個(gè)存儲(chǔ)單元容量為字節(jié))。為了方便管理,必須為每一個(gè)存儲(chǔ)單元編號(hào),這個(gè)編號(hào)就是存儲(chǔ)單元的“地址”。每個(gè)存儲(chǔ)單元都有一個(gè)惟一的地址。(2)在地址所標(biāo)識(shí)的存儲(chǔ)單元中存放數(shù)據(jù)。注意:內(nèi)存單元的地址與內(nèi)存單元中的數(shù)據(jù)是兩個(gè)完全不同的概念。假設(shè)有這樣一個(gè)程序:main() int num; scanf(%d,&n

8、um); printf(num=%dn, num); C編譯程序編譯到該變量定義語(yǔ)句時(shí),將變量num 登錄到“符號(hào)表”中。符號(hào)表的關(guān)鍵屬性有兩個(gè):一是“標(biāo)識(shí)符名(id)” ,二是該標(biāo)識(shí)符在內(nèi)存空間中的“地址(addr)” 。為描述方便,假設(shè)系統(tǒng)分配給變量num的2字節(jié)存儲(chǔ)單元為 3000 和3001,則起始地址3000就是變量num在內(nèi)存中的地址。返回本節(jié)目錄6.2.1 地址和指針的概念 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)3.變量值的存取通過(guò)變量在內(nèi)存中的地址進(jìn)行系統(tǒng)執(zhí)行“scanf(”%d“,&num);”和“printf(”num=%dn“, num);”時(shí),存取變量num

9、值的方式可以有兩種:(1)直接訪問直接利用變量的地址進(jìn)行存取 上例中scanf(“%d”,&num)的執(zhí)行過(guò)程是這樣的: 用變量名num作為索引值,檢索符號(hào)表,找到變量num的起始地址3000;然后將鍵盤輸入的值(假設(shè)為)送到內(nèi)存單元3000和3001中。 printf(num=%dn,num)的執(zhí)行過(guò)程,與scanf( )很相似: 首先找到變量num的起始地址3000,然后從3000和3001中取出其值,最后將它輸出。 返回本節(jié)目錄6.2.1 地址和指針的概念 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)(2)間接訪問通過(guò)另一變量訪問該變量的值 語(yǔ)言規(guī)定:在程序中可以定義一種特殊的變量

10、(稱為指針變量),用來(lái)存放其它變量的地址。 例如,假設(shè)定義了這樣一個(gè)指針變量num_pointer,它被分配到4000、4001單元,其值可通過(guò)賦值語(yǔ)句“num_pointer=num;”得到。此時(shí),指針變量num_pointer的值就是變量num在內(nèi)存中的起始地址3000。 【例5.2】中 printf(“min=%d, max=%dn”, *num1_p, *num2_p); 語(yǔ)句:通過(guò)指針變量,間接訪問變量的值。返回本節(jié)目錄6.2.2 指向變量的指針變量 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄1.指針與指針變量 (1)指針即地址 一個(gè)變量的地址稱為該變量的指針。通

11、過(guò)變量的指針能夠找到該變量。(2)指針變量專門用于存儲(chǔ)其它變量地址的變量指針變量num_pointer的值就是變量num的地址。指針與指針變量的區(qū)別,就是變量值與變量的區(qū)別。(3)為表示指針變量和它指向的變量之間的關(guān)系,用指針運(yùn)算符“*”表示。 例如,指針變量num_pointer與它所指向的變量num的關(guān)系,表示為:*num_pointer,即*num_pointer等價(jià)于變量num。因此,下面兩個(gè)語(yǔ)句的作用相同:num=3; /*將3直接賦給變量num*/num_pointer=# /*使num_pointer指向num */*num_pointer=3; /*將3賦給指針變量nu

12、m_pointer所指向的變量*/6.2.2 指向變量的指針變量 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄2.指針變量的定義與應(yīng)用【例6.1】 程序中頭三行的變量定義語(yǔ)句指針變量的定義 與一般變量的定義相比,除變量名前多了一個(gè)星號(hào)“*” (指針變量的定義標(biāo)識(shí)符)外,其余一樣:數(shù)據(jù)類型 *指針變量, *指針變量2; 注意:此時(shí)的指針變量p_int、p_f、p_ch,并未指向某個(gè)具體的變量(稱指針是懸空的)。使用懸空指針很容易破壞系統(tǒng),導(dǎo)致系統(tǒng)癱瘓?!纠?.1】中間三行的賦值語(yǔ)句取地址運(yùn)算()取地址運(yùn)算的格式: 變量例如,&num_int、&num_f、&num_ch的結(jié)果,

13、分別為變量num_int、num_f、num_ch的地址。注意:指針變量只能存放指針(地址),且只能是相同類型變量的地址。C語(yǔ)言中用NULL表示空指針。若有語(yǔ)句:p=NULL;則表示指針p為空,沒有指向任何對(duì)象。 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本章目錄 6.3.2 通過(guò)指針引用數(shù)組元素6.3.1 指向數(shù)組元素的指針6.3 指針與數(shù)組6.3.3 數(shù)組名作函數(shù)參數(shù)6.3.4 指針與字符數(shù)組6.3.5 數(shù)組指針6.3.1 指向數(shù)組元素的指針 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境) 返回本節(jié)目錄指向數(shù)組的元素指針變量的定義,與指向普通變量的指針變量的定義方法一樣例如

14、,int array10; ( 定義array為包含10個(gè)整型變量的數(shù)組) int *pointer (定義pointer為指向整型變量的指針變量)應(yīng)當(dāng)注意,如果數(shù)組為int 型,則指針變量亦應(yīng)指向int 型。下面是對(duì)該指針賦值:pointer= &array0;把a(bǔ)rray0 元素的地址賦給指針變量pointer。也就是說(shuō),pointer 指向 array數(shù)組的第0號(hào)元素。C 語(yǔ)言規(guī)定數(shù)組名代表數(shù)組的首地址,也就是第一個(gè)元素的地址。因此,下面兩個(gè)語(yǔ)句等價(jià)pointer= &array0; pointerarray;注意:數(shù)組名不代表整個(gè)數(shù)組,上述“pointerarray;”的作用是“把a(bǔ)r

15、ray數(shù)組的第一個(gè)元素的地址賦給指針變量pointer”而不是“把a(bǔ)rray數(shù)組各元素的值賦給pointer”。 6.3.2 通過(guò)指針引用數(shù)組元素 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄1 通過(guò)指針引用一維數(shù)組中的元素 如果有“int array10,*pointer=array;” ,則:(1)pointer+i和array+i都是數(shù)組元素arrayi的地址。 (2)*(pointer+i)和*(array+i)就是數(shù)組元素arrayi。(3)指向數(shù)組的指針變量,也可將其看作是數(shù)組名,因而可按下標(biāo)法來(lái)使用。例如,pointeri等價(jià)于*(pointer+i)。注意:p

16、ointer+1指向數(shù)組的下一個(gè)元素,而不是簡(jiǎn)單地使指針變量pointer的值+1。其實(shí)際變化為pointer+1*size(size為一個(gè)元素占用的字節(jié)數(shù))。例如,假設(shè)指針變量pointer的當(dāng)前值為3000,則pointer+1為3000+1*2=3002,而不是3001。6.3.2 通過(guò)指針引用數(shù)組元素 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄【例6.3】 使用指向數(shù)組的指針變量來(lái)引用數(shù)組元素。/*程序名為l6_3.cpp */*程序功能:使用指向數(shù)組的指針變量來(lái)引用數(shù)組元素*/main() int array10, *pointer=array, i; print

17、f(“Input 10 numbers: ”); for(i=0; i10; i+) scanf(“%d”, pointer+i);/*使用指針變量來(lái)輸入數(shù)組元素的值*/ printf(“array10: ”); for(i=0; i10; i+) printf(“%d ”, *(pointer+i);/*使用指向數(shù)組的指針變量輸出數(shù)組*/ printf(“n”); 6.3.2 通過(guò)指針引用數(shù)組元素 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄程序運(yùn)行情況:Input 10 numbers: 0 1 2 3 4 5 6 7 8 9array10: 0 1 2 3 4 5 6

18、7 8 9程序說(shuō)明:程序中第3行和第6行的2個(gè)for語(yǔ)句,等價(jià)于下面的程序段:for(i=0; i10; i+,pointer+) scanf(“%d”,pointer);printf(“array10: ”);pointer=array; /*使pointer重新指向數(shù)組的第一個(gè)元素*/for(i=0; i10; i+,pointer+) printf(“%d”,*pointer); 6.3.2 通過(guò)指針引用數(shù)組元素 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄2 通過(guò)指針引用二維數(shù)組中的元素 在C語(yǔ)言中,二維數(shù)組是按行優(yōu)先的規(guī)律轉(zhuǎn)換為一維線性存放在內(nèi)存中的,因此,可以通過(guò)

19、指針訪問二維數(shù)組中的元素。 如果有:int aMN; 則將二維數(shù)組中的元素aij轉(zhuǎn)換為一維線性地址的一般公式是: 線性地址aiMj 其中:a為數(shù)組的首地址, M和N分別為二維數(shù)組行和列的元素個(gè)數(shù)。 6.3.2 通過(guò)指針引用數(shù)組元素 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄【例6.4】:給定某年某月某日,將其轉(zhuǎn)換成這一年的第幾天并輸出。 此題的算法很簡(jiǎn)單,若給定的月是i,則將1、2、3、i-1月的各月天數(shù)累加,再加上指定的日。但對(duì)于閏年,二月的天數(shù)29天,因此還要判定給定的年是否為閏年。為實(shí)現(xiàn)這一算法,需設(shè)置一張每月天數(shù)列表,給出每個(gè)月的天數(shù),考慮閏年非閏年的情況,此表可設(shè)

20、置成一個(gè)2行13列的二維數(shù)組,其中第1行對(duì)應(yīng)的每列(設(shè)112列有效)元素是平年各月的天數(shù),第2行對(duì)應(yīng)的是閏年每月的天數(shù)。程序中使用指針作為函數(shù)day_of_year的形式參數(shù)。/*程序名為l6_4.cpp */*程序功能:使用指向數(shù)組的指針變量來(lái)引用數(shù)組元素*/#include main( ) static int day_tab213=0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31 ;int y, m, d;scanf(%d%d%d, &y, &m, &d); 6.3.2 通過(guò)指針引用數(shù)組

21、元素 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄printf(%dn, day_of_year(day_tab,y,m,d) ); /* 實(shí)參為二維數(shù)組名 */day_of_year(day_tab,year,month,day)int *day_tab; /* 形式參數(shù)為指針 */int year, month, day; int i, j;i = (year%4=0&year%100!=0) | year%400=0;for ( j=1; jmonth; j+ )day += *( day_tab+i*13+j ); /* day_tab+i*13+j:對(duì)二維數(shù)組中元素

22、進(jìn)行地址變換 */return(day); 由于語(yǔ)言對(duì)于二維數(shù)組中的元素在內(nèi)存中是按行存放的,所以在函數(shù)day_of_year 中要使用公式day_tab+i*13+j計(jì)算main函數(shù)的day_tab中元素對(duì)應(yīng)的地址。 6.3.3 數(shù)組名作函數(shù)參數(shù) C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄數(shù)組名可以用作函數(shù)的形參和實(shí)參。如:main ( ) int array10 ;f ( array , 10 ) f ( arr , n )int arr , n ; array 為實(shí)參數(shù)組名,arr 為形參數(shù)組名。 6.3.3 數(shù)組名作函數(shù)參數(shù) C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6

23、.0環(huán)境)返回本節(jié)目錄【例6.5】將數(shù)組a 中n 個(gè)整數(shù)按相反順序存放 解此題的算法為:將a 0與an-1 對(duì)換,再將a1與an-2對(duì)換, ,直到將a(n-1)/2 與a n-int(n-1)/2) 對(duì)換。今用循環(huán)處理此問題,設(shè)兩個(gè)“位置指示變量”i 和j , i 的初值為0 , j 的初值為n-1。將ai與aj 交換,然后使i 的值加1 , j 的值減1 ,再將ai與aj對(duì)換,直到i =(n-1)/2 為止。程序如下:程序名為l6_5.cppVoid inv(int x,int n) /*形參x是數(shù)組名*/ int temp,i,j,m=(n-1)/2; for(i=0;i=m;i+)j=n

24、-1-i;temp=xi;xiI=xj;xj=temp;return;main() int i,a10=3,7,9,11,0,6,7,5,4,2;for(i=0;i10;i+) 6.3.3 數(shù)組名作函數(shù)參數(shù) C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄printf(“%d,”,ai);printf(“n”);inv(a,10);for(i=0;i10;i+)printf(“%d,”,ai);printf(“n”);運(yùn)行情況如下:3,8,11,0,5,9,4,7,10,2,2,10,7,4,9,5,0,11,8,3,程序說(shuō)明: 主函數(shù)中數(shù)組名為 a ,賦以各元素初值。函數(shù) in

25、v 中的形參數(shù)組名為 x ,在 inv 函數(shù)中不具體定義數(shù)組元素的個(gè)數(shù),元素個(gè)數(shù)由形參變量 n 傳入(今對(duì)應(yīng)的實(shí)參值為 10 )。這樣做可以增加函數(shù)的靈活性。即不必要求函數(shù) inv 中的形參數(shù)組 x 和 main 函數(shù)中的實(shí)參數(shù)組 a 長(zhǎng)度相同。如果在main函數(shù)中有函數(shù)調(diào)用語(yǔ)句:“ inv ( a , 10 )”,表示要求對(duì) a 數(shù)組的前 10 個(gè)元素實(shí)行題目要求的顛倒排列。如果改為 “inv ( a , 5 )” ,則表示將 a 數(shù)組的前 5 個(gè)元素實(shí)行顛倒排列,此時(shí),函數(shù) inv 只處理 5 個(gè)數(shù)組元素。函數(shù) inv 中的 m 是 i 值的上限,當(dāng) i m 時(shí),則結(jié)束循環(huán)過(guò)程。 6.3.

26、3 數(shù)組名作函數(shù)參數(shù) C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄 小結(jié): 引入指向數(shù)組的指針變量后,數(shù)組及指向數(shù)組的指針變量作函數(shù)參數(shù)時(shí),可有種等價(jià)形式(本質(zhì)上是一種,即指針數(shù)據(jù)作函數(shù)參數(shù)):(1)形參、實(shí)參都用數(shù)組名(2)形參、實(shí)參都用指針變量(3)形參用指針變量、實(shí)參用數(shù)組名(4)形參用數(shù)組名、實(shí)參用指針變量 6.3.4 指針與字符數(shù)組 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄1. 字符串的表示與引用在語(yǔ)言中,既可以用字符數(shù)組表示字符串,也可用字符指針變量來(lái)表示;引用時(shí),既可以逐個(gè)字符引用,也可以整體引用。(1)逐個(gè)引用【例6.6】 使用字符指針變

27、量表示和引用字符串。/*程序名為l6_6.cpp /main() char *string=”I love Beijing.”; for(; *string!=0; string+) printf(“%c”, *string); printf(“n”); 程序運(yùn)行結(jié)果: I love Beijing.程序說(shuō)明:char *string=I love Beijing.;語(yǔ)句定義并初始化字符指針變量string:用串常量“I love Beijing.”的地址(由系統(tǒng)自動(dòng)開辟、存儲(chǔ)串常量的內(nèi)存塊的首地址)給string賦初值。 6.3.4 指針與字符數(shù)組 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.

28、0環(huán)境)返回本節(jié)目錄(2)整體引用【例6.7】采取整體引用的辦法,改寫例5.9。/*程序名為l6_7.cpp */*程序功能:使用字符指針變量表示和引用字符串*/main() char *string=”I love Beijing.”; printf(“%sn”,string);程序說(shuō)明:printf(“%sn”,string);語(yǔ)句 通過(guò)指向字符串的指針變量string,整體引用它所指向的字符串的原理:系統(tǒng)首先輸出string指向的第一個(gè)字符,然后使string自動(dòng)加,使之指向下一個(gè)字符;重復(fù)上述過(guò)程,直至遇到字符串結(jié)束標(biāo)志。注意:其它類型的數(shù)組,是不能用數(shù)組名來(lái)一次性輸出它的全部元素的,

29、只能逐個(gè)元素輸出。 6.3.4 指針與字符數(shù)組 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄2.字符指針變量與字符數(shù)組之比較雖然用字符指針變量和字符數(shù)組都能實(shí)現(xiàn)字符串的存儲(chǔ)和處理,但二者是有區(qū)別的,不能混為一談。(1)存儲(chǔ)內(nèi)容不同。字符指針變量中存儲(chǔ)的是字符串的首地址,而字符數(shù)組中存儲(chǔ)的是字符串本身(數(shù)組的每個(gè)元素存放一個(gè)字符)。(2)賦值方式不同。對(duì)字符指針變量,可采用下面的賦值語(yǔ)句賦值: char *pointer; pointer=This is a example.;而字符數(shù)組,雖然可以在定義時(shí)初始化,但不能用賦值語(yǔ)句整體賦值。下面的用法是非法的: char char

30、_array20; char_array=This is a example.; /*非法用法*/(3)指針變量的值是可以改變的,字符指針變量也不例外; 6.3.4 指針與字符數(shù)組 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄3. 字符串指針作函數(shù)參數(shù)【例6.8】 用函數(shù)調(diào)用方式,實(shí)現(xiàn)字符串的復(fù)制。/*程序名為l6_8.cpp */*/*string_copy()函數(shù):復(fù)制一個(gè)字符串*/ /*形參:字符指針str_from接收源串,字符指針 str_to存儲(chǔ)目標(biāo)串 */*返回值:無(wú)*/ /*/void string_copy(char *str_from, char *str

31、_to) int i=0; for(; (*(str_to+i)=*(str_from+i)!=0; i+) ; /*循環(huán)體為空語(yǔ)句*/ main() char array_str120=”I am a teacher.”; char array_str220; 6.3.4 指針與字符數(shù)組 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄string_copy(array_str1, array_str2) ; /*數(shù)組名作實(shí)參*/printf(“array_str2=%sn”, array_str2); 程序運(yùn)行結(jié)果: I am a teacher.程序說(shuō)明: for(; (*

32、(str_to+i)=*(str_from+i)!=0; i+) ; 語(yǔ)句的執(zhí)行過(guò)程為:首先將源串中的當(dāng)前字符,復(fù)制到目標(biāo)串中;然后判斷該字符(即賦值表達(dá)式的值)是否是結(jié)束標(biāo)志。如果不是,則相對(duì)位置變量i的值增1,以便復(fù)制下一個(gè)字符;如果是結(jié)束標(biāo)志,則結(jié)束循環(huán)。其特點(diǎn)是:先復(fù)制、后判斷,循環(huán)結(jié)束前,結(jié)束標(biāo)志已經(jīng)復(fù)制。 6.3.5 數(shù)組指針 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄 我們上面介紹的指針都是指向某一類型的變量的,例如可以使一個(gè)指針p指向某一數(shù)組元素。如果p的值加1,則指向下一個(gè)元素,這樣指針在處理一維數(shù)組時(shí)非常方便,但在處理二維數(shù)組時(shí)就不適合了。如果定義一個(gè)指

33、針p,讓它指向一個(gè)包含n個(gè)元素的一維數(shù)組,且p的增值以一維數(shù)組的長(zhǎng)度為單位,此時(shí),如果指針P指向二維數(shù)組的某一行,則p+1就指向了該二維數(shù)組的下一行。在C+中,這樣的指針被稱為數(shù)組指針,使用數(shù)組指針可以很方便地處理二維數(shù)組。 數(shù)組指針的說(shuō)明形式如下: 存儲(chǔ)類型 數(shù)據(jù)類型 (*指針名)元素個(gè)數(shù) 例如,在程序中定義一個(gè)數(shù)組指針: int (*p)4; 它表明指針p指向的數(shù)組指針p指向一個(gè)一維數(shù)組,p的值就是該一維數(shù)組的首地址。在使用數(shù)組指針時(shí),有兩點(diǎn)一定要注意:(1) *p兩側(cè)的括號(hào)一定不要漏掉,如果寫成*p4的形式,由于 的運(yùn)算級(jí)別高,因此p先和4結(jié)合,是數(shù)組,然后再與前面的*結(jié)合,*p4是指針

34、數(shù)組。 6.3.5 數(shù)組指針 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄(2) p是一個(gè)行指針,它只能指向一個(gè)包含n個(gè)元素的一維數(shù)組,不能指向一維數(shù)組中的元素。【例6.9】:用數(shù)組指針處理二維數(shù)組。程序名為l6_9.cppmain()int a23=1,3,5,7,9,11;int (*p)3;int i,j;p=a;for(i=0;i2;i+) for(j=0;j *num2_p ) /* 即num1num2)*/ exchange(num1_p, num2_p); /*指針變量作實(shí)參*/ printf(“min=%d, max=%dn”, num1, num2); /*

35、輸出排序后的num1和num2的值*/程序運(yùn)行情況:Input the first number:9Input the second number:6num1=9, num2=6min=6, max=9程序說(shuō)明:形參指針變量pointer1(指向變量num1)和pointer2(指向變量num2),在函數(shù)調(diào)用開始時(shí)才分配存儲(chǔ)空間,函數(shù)調(diào)用結(jié)束后立即被釋放。雖然被調(diào)用函數(shù)不能改變實(shí)參指針變量的值,但可以改變它們所指向的變量的值。 6.4.2 函數(shù)指針 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄1.函數(shù)指針的概念 一個(gè)函數(shù)在編譯時(shí),被分配了一個(gè)入口地址,這個(gè)地址就稱為該函數(shù)的指

36、針??梢杂靡粋€(gè)指針變量指向一個(gè)函數(shù),然后通過(guò)該指針變量調(diào)用此函數(shù)?!纠?.11】:求a 和b中的大者。程序名為l6_11.cppmain ( ) int max( ); int (*p)( ); int a,b,c; p=max; scanf (%d,%d”,&a,&b); 6.4.2 函數(shù)指針 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄c=(*p) (a,b);printf (a= %d,b= %d,max = %d,a,b,c);max (int x,int y)int z;if (xy) z = x;else z=y;return (z)程序說(shuō)明: 其中int (*p

37、)( )說(shuō)明p 是一個(gè)指向函數(shù)的指針變量,此函數(shù)帶回整型的返回值。注意*p 兩側(cè)的括弧不可省略,表示p 先與*結(jié)合,是指針變量,然后再與后面的()結(jié)合,表示此指針變量指向函數(shù),這個(gè)函數(shù)值(即函數(shù)返回的值)是整型的。如果寫成“int *p” ,則由于()優(yōu)先級(jí)高于*,它就成了說(shuō)明一個(gè)函數(shù)了,這個(gè)函數(shù)的返回值是指向整型變量的指針。 6.4.2 函數(shù)指針 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄 2.指向函數(shù)的指針變量(1)定義格式 函數(shù)類型 (*指針變量)( ); 注意:“*指針變量”外的括號(hào)不能缺,否則成了返回指針值的函數(shù)。 例如,int (*fp)(); /* fp為指向

38、int函數(shù)的指針變量*/(2)賦值 函數(shù)名代表該函數(shù)的入口地址。因此,可用函數(shù)名給指向函數(shù)的指針變量賦值。 指向函數(shù)的指針變量&函數(shù)名; 注意:函數(shù)名后不能帶括號(hào)和參數(shù);函數(shù)名前的“&”符號(hào)是可選的。(3)調(diào)用格式 (*函數(shù)指針變量)(實(shí)參表)(4) 函數(shù)名作實(shí)參時(shí),因?yàn)橐笔±ㄌ?hào)和參數(shù),造成編譯器無(wú)法判斷它是一個(gè)變量還是一個(gè)函數(shù),所以必須加以說(shuō)明。(5) 注意:對(duì)指向函數(shù)的指針變量,諸如p+i、p+/p-等運(yùn)算是沒有意義的。 6.4.2 函數(shù)指針 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄3.指向函數(shù)的指針變量作函數(shù)參數(shù) 指向函數(shù)的指針變量的常用用途之一,就是將函數(shù)指針作

39、參數(shù),傳遞到其它函數(shù)。【例6.12】:設(shè)一個(gè)函數(shù)process ,在調(diào)用它的時(shí)候,每次實(shí)現(xiàn)不同的功能。輸入a 和b 兩個(gè)數(shù),第一次調(diào)用process時(shí)找出a 和b 中大者,第二次找出其中小者,第三次求a 與b 之和。程序如下:程序名為l6_12.cppmain()int max(int,int); /*函數(shù)聲明*/int min(int,int); /*函數(shù)聲明*/int add(int,int); /*函數(shù)聲明*/int a,b;scanf(“%d,%d”,&a,&b);printf(“max=”); 6.4.2 函數(shù)指針 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄pro

40、cess(a,b,max);printf(“min=”);process(a,b,min);printf(“sum=”);process(a,b,add);max(int x,int y) /*函數(shù)定義*/int z;if(xy) z=x;else z=y;return(z);min(int x,int y) /*函數(shù)定義*/int z;if(xy) z=x; 6.4.2 函數(shù)指針 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄else z=y;return(z);add(int x,int y) /*函數(shù)定義*/int z;z=x+y;return(z);process(in

41、t x,int y,int(*fun)(int,int) 函數(shù)定義. int(*fun)(int,int)表示fun是指向*/*函數(shù)的指針,該函數(shù)是一個(gè)整型函數(shù),有兩個(gè)整型形參.*/int result;result=(*fun)(x,y);printf(%dn”,result); 6.4.2 函數(shù)指針 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄程序運(yùn)行結(jié)果如下:3,9max=9min=3sum=12程序說(shuō)明: max、min 和sum 是已定義的三個(gè)函數(shù),分別用來(lái)實(shí)現(xiàn)求大數(shù)、求小數(shù)和求和的功能。在main 函數(shù)中第一次調(diào)用process函數(shù)時(shí),除了將a 和b 作為實(shí)參將兩

42、個(gè)數(shù)傳給process的形參x 、y 外,還將函數(shù)名max作為實(shí)參將其入口地址傳送給process函數(shù)中的形參-指向函數(shù)的指針變量fun,這時(shí),process函數(shù)中的(*fun) ( x , y ) 相當(dāng)于max ( x , y ) ,執(zhí)行process可以輸出a 和b 中大者。在main函數(shù)第二次調(diào)用時(shí),改以函數(shù)名min 作實(shí)參,此時(shí)process函數(shù)的形參fun 指向函數(shù)min , 在process函數(shù)中的函數(shù)調(diào)用(*fun) ( x , y )相當(dāng)于min ( x , y )。同理,第三次調(diào)用process函數(shù)時(shí),(*fun) ( x , y )相當(dāng)于add ( x , y )。從本例可

43、以清楚地看到,不論執(zhí)行max 、min或add ,函數(shù)process 一點(diǎn)都沒有改動(dòng),只是在調(diào)用process函數(shù)時(shí)實(shí)參函數(shù)名改變而已。這就增加了函數(shù)使用的靈活性。 6.4.3 指針函數(shù) C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄指針函數(shù)是指返回值為指針的函數(shù),函數(shù)的返回值可以是不同類型的指針指針函數(shù)定義格式如下:函數(shù)類型 *函數(shù)名(形參表)例如: int *pr(x,y); pr是函數(shù)名,調(diào)用它以后能得到一個(gè)指向整型數(shù)據(jù)的指針(地址)。x 、y 是函數(shù)pr 的形參。請(qǐng)注意在*pr兩側(cè)沒有括弧,在pr的兩側(cè)分別為*運(yùn)算符和()運(yùn)算符。而()優(yōu)先級(jí)高于*,因此a 先與()結(jié)合

44、。顯然這是函數(shù)形式。這個(gè)函數(shù)前面有一個(gè)*,表示此函數(shù)是指針型函數(shù)(函數(shù)值是指針)。最前面的int 表示返回的指針指向整型變量。 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本章目錄6.5.2 指針數(shù)組6.5.3 main函數(shù)的參數(shù)6.5.1 多級(jí)指針6.5 多級(jí)指針與指針數(shù)組6.5.1 多級(jí)指針 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)1.概念 在前面的敘述中,一個(gè)指針變量可以指向一個(gè)相應(yīng)數(shù)據(jù)類型的數(shù)據(jù),例如: int a,*p; p=&a; 使指針p指向a,則指針p所指向的變量*p就是要處理的數(shù)據(jù)變量a.如果同時(shí)存在另一個(gè)指針pp,并且把指針p的地址賦予指針變量pp,即:

45、pp=&p; 則pp就指向指針p,這時(shí)指針pp所指向的變量*pp就是指針p。在C+中,把pp這樣的指向指針的指針稱為多級(jí)指針。返回本節(jié)目錄2.定義格式 數(shù)據(jù)類型 *指針變量, *指針變量2;6.5.1 多級(jí)指針 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄【例6.13】用二級(jí)指針處理多個(gè)字符串。程序名為l6_13.cppmain ( ) static char * name = Follow me,BASIC,FORTRAN,Great Wall,Computerdesign; char * * p;int i;for(i=0;i5;i+) p=name+i; printf(

46、“%sn”,*p); 程序運(yùn)行結(jié)果:Follow meBASICFORTRANGreat WallComputerdesign6.5.1 多級(jí)指針 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄程序說(shuō)明:指針數(shù)組的元素也可以不指向字符串,而指向整型數(shù)據(jù)或?qū)嵭蛿?shù)據(jù)等,例如:int a5=l,3,5,7,9 ,int *num5=&a0,&al,&a2,&a3,&a4;int * * p ;此時(shí)為了得到數(shù)據(jù)“5 ,可以先使p =num + 2 ,然后輸出* p 。注意*p 是p 間接指向的對(duì)象的地址。而*p 是p 間接指向的對(duì)象的值。6.5.2 指針數(shù)組 C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境) 1.概念 2.定義格式 數(shù)組的每個(gè)元素都是一個(gè)指針數(shù)據(jù)。 數(shù)據(jù)類型 *數(shù)組名元素個(gè)數(shù) 指針數(shù)組常適用于指向若干字符串,這樣使字符串處理更加靈活方便。返回本節(jié)目錄6.5.3 main函數(shù)的參數(shù) C語(yǔ)言程序設(shè)計(jì) (Visual C+ 6.0環(huán)境)返回本節(jié)目錄指針數(shù)組的一個(gè)重要應(yīng)用是作為main函數(shù)的形參。在前面講述的程序中,main函數(shù)的第一行全部寫成了以下形式:main ( )括號(hào)中為空,表示沒有參數(shù)。實(shí)際上main函數(shù)是可以帶參數(shù)的,其一般形式為:main (

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論