實(shí)用C語言程序設(shè)計(jì)教程6便捷工具指針ppt課件_第1頁
實(shí)用C語言程序設(shè)計(jì)教程6便捷工具指針ppt課件_第2頁
實(shí)用C語言程序設(shè)計(jì)教程6便捷工具指針ppt課件_第3頁
實(shí)用C語言程序設(shè)計(jì)教程6便捷工具指針ppt課件_第4頁
實(shí)用C語言程序設(shè)計(jì)教程6便捷工具指針ppt課件_第5頁
已閱讀5頁,還剩166頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第第6章章 便利工具便利工具指針指針C言語程序設(shè)計(jì)言語程序設(shè)計(jì)Programming in C思索與適用的結(jié)合,就能產(chǎn)生思索與適用的結(jié)合,就能產(chǎn)生明確的概念,就能找到一些簡(jiǎn)便方明確的概念,就能找到一些簡(jiǎn)便方法,這些方法的發(fā)現(xiàn)鼓勵(lì)著自尊心,法,這些方法的發(fā)現(xiàn)鼓勵(lì)著自尊心,而方法的準(zhǔn)確性又能使智力得到滿而方法的準(zhǔn)確性又能使智力得到滿足,原來枯燥無味的任務(wù),有了簡(jiǎn)足,原來枯燥無味的任務(wù),有了簡(jiǎn)便方法,就令人感到興趣了。便方法,就令人感到興趣了。 1 1、了解變量指針和地址、了解變量指針和地址2 2、了解數(shù)組指針的概念、定義和運(yùn)算、了解數(shù)組指針的概念、定義和運(yùn)算3 3、運(yùn)用指針運(yùn)算符、運(yùn)用指針運(yùn)算符&

2、amp; &和和* *等等4 4、經(jīng)過指針訪問數(shù)組元素、字符數(shù)組、經(jīng)過指針訪問數(shù)組元素、字符數(shù)組5 5、了解指針和數(shù)組間的關(guān)系、了解指針和數(shù)組間的關(guān)系6 6、了解并運(yùn)用函數(shù)援用中的指針、了解并運(yùn)用函數(shù)援用中的指針7 7、了解二級(jí)指針與指針數(shù)組、了解二級(jí)指針與指針數(shù)組8 8、了解動(dòng)態(tài)內(nèi)存分配、了解動(dòng)態(tài)內(nèi)存分配 本章教學(xué)目的本章教學(xué)目的 教學(xué)重點(diǎn)和難點(diǎn)教學(xué)重點(diǎn)和難點(diǎn)重點(diǎn)重點(diǎn)指針與數(shù)組指針與數(shù)組指針數(shù)組指針數(shù)組 難點(diǎn)難點(diǎn)指針數(shù)組指針數(shù)組經(jīng)過指針訪問數(shù)組元素經(jīng)過指針訪問數(shù)組元素本章內(nèi)容本章內(nèi)容6.1 6.1 指針的根本操作與運(yùn)算指針的根本操作與運(yùn)算6.2 6.2 利用指針訪問數(shù)組利用指針訪問數(shù)

3、組 6.3 6.3 指針數(shù)組指針數(shù)組6.4 6.4 指針與函數(shù)指針與函數(shù)6.5 6.5 動(dòng)態(tài)內(nèi)存分配動(dòng)態(tài)內(nèi)存分配 1、以更簡(jiǎn)約的方式援用大的數(shù)據(jù)構(gòu)造data structure。 數(shù)據(jù)元素相互之間的關(guān)系稱為構(gòu)造structure。 數(shù)據(jù)構(gòu)造是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。數(shù)據(jù)構(gòu)造普通包括三個(gè)方面:數(shù)據(jù)的邏輯構(gòu)造、數(shù)據(jù)的存儲(chǔ)構(gòu)造以及對(duì)數(shù)據(jù)的根本操作。 程序中的數(shù)據(jù)無論如何增長(zhǎng),總是位于計(jì)算機(jī)的內(nèi)存中,因此,必然會(huì)有地址。指針可以把地址作為一個(gè)完好數(shù)據(jù)值的速記符號(hào)。 C C言語中指針的重要用途:言語中指針的重要用途:2、指針使程序的不同部分或函數(shù)能共享數(shù)據(jù)。3、利用指針,能在程序

4、執(zhí)行過程中預(yù)留新的內(nèi)存空間。到如今為止,在程序中能運(yùn)用的內(nèi)存是經(jīng)過顯式定義分配給變量的內(nèi)存。在許多運(yùn)用中,假設(shè)程序能在運(yùn)轉(zhuǎn)時(shí)獲得新的內(nèi)存空間,并讓指針指向這一內(nèi)存那么更為方便。4、指針可用來記錄數(shù)據(jù)項(xiàng)之間的關(guān)系。在高級(jí)言語程序設(shè)計(jì)中運(yùn)用中,指針被廣泛用于構(gòu)造單個(gè)數(shù)據(jù)值之間的聯(lián)絡(luò)。比如,程序員通常在第一個(gè)數(shù)據(jù)的內(nèi)部表示中包含指向下一個(gè)數(shù)據(jù)項(xiàng)的指針,來闡明這兩個(gè)數(shù)據(jù)之間有概念上的順序關(guān)系。 本章工程義務(wù)本章工程義務(wù) 利用指針,編程實(shí)現(xiàn)利用指針,編程實(shí)現(xiàn)“學(xué)生信息管理系統(tǒng)中學(xué)學(xué)生信息管理系統(tǒng)中學(xué)生成果的管理。生成果的管理。 6.1 指針的根本操作與運(yùn)算指針的根本操作與運(yùn)算 6.1.1 6.1.1 指

5、針的根本運(yùn)算和操作指針的根本運(yùn)算和操作 6.1.2 6.1.2 多級(jí)指針概念與地址關(guān)系多級(jí)指針概念與地址關(guān)系 指針變量就是存放某個(gè)地址的變量,指針的指針變量就是存放某個(gè)地址的變量,指針的值是地址。值是地址。 程序中通常并不直接指出或運(yùn)用內(nèi)存地址,程序中通常并不直接指出或運(yùn)用內(nèi)存地址,由于地址的運(yùn)用和系統(tǒng)有關(guān),每次運(yùn)轉(zhuǎn)程序時(shí)內(nèi)由于地址的運(yùn)用和系統(tǒng)有關(guān),每次運(yùn)轉(zhuǎn)程序時(shí)內(nèi)存地址都能夠會(huì)發(fā)生改動(dòng)。存地址都能夠會(huì)發(fā)生改動(dòng)。 常用指針來間接尋址內(nèi)存數(shù)據(jù)。常用指針來間接尋址內(nèi)存數(shù)據(jù)。 6.1.1 6.1.1 指針的根本運(yùn)算和操作指針的根本運(yùn)算和操作1 1指針賦值指針賦值 2 2指針運(yùn)算指針運(yùn)算3 3文件指針

6、變量的運(yùn)用文件指針變量的運(yùn)用 1 1指針賦值指針賦值 例如:例如:int int * *p; /p; /* *定義一個(gè)指向整型數(shù)據(jù)的指針變量定義一個(gè)指向整型數(shù)據(jù)的指針變量p p* */ / 在程序中假想象運(yùn)用該指針變量,必需先對(duì)其賦值,使在程序中假想象運(yùn)用該指針變量,必需先對(duì)其賦值,使其指向某個(gè)地址。其指向某個(gè)地址。 方式方式1 1: 指針變量名指針變量名=&=&變量名;變量名;方式方式2 2: 指針變量名指針變量名= =另一曾經(jīng)賦值的指針變量;另一曾經(jīng)賦值的指針變量; 指針變量名指針變量名= =指針常量;指針常量;指針賦值有以下方式:指針賦值有以下方式: #include v

7、oid main( ) unsigned c10=1,2,3,4,5,6,7,8,9,0,a=16; unsigned *p=&a /*方式方式1,*將變量將變量p闡明為指針變量闡明為指針變量*/ unsigned *p1=c; /*方式方式2*/printf(%u %un,a,&a);printf(%u %un,p,&p); printf(%un,c); printf(%u %un,p1,&p1); printf(“%dn,*p); /* 運(yùn)算符運(yùn)算符*,表示取指針,表示取指針p所指向的內(nèi)所指向的內(nèi)容容*/ /* 經(jīng)過經(jīng)過p間接存取變量間接存取變量a的值的值

8、*/ printf(%un,*p1);【例【例6-16-1】閱讀并了解程序中變量、地址和指針之間的關(guān)系?!块喿x并了解程序中變量、地址和指針之間的關(guān)系。留意:留意:v運(yùn)用沒有初始化的指針會(huì)產(chǎn)生不可預(yù)料后果。運(yùn)用沒有初始化的指針會(huì)產(chǎn)生不可預(yù)料后果。可用可用“空空值初始化防止這種景象。值初始化防止這種景象。 v將將0 0賦給指針變量,不能了解為將賦給指針變量,不能了解為將0 0地址賦給指針變地址賦給指針變量,闡明該指針變量目前不指向任何變量或地址。量,闡明該指針變量目前不指向任何變量或地址。例:例:int int * *p=NULL,p=NULL,* *pm1,pm1,* *pm2;pm2;pm1=

9、0;pm1=0;pm2= 0; pm2= 0; pm1pm2p圖圖 6-3 “空指針值的表示空指針值的表示1 1& & :取內(nèi)存地址,單目運(yùn)算符:取內(nèi)存地址,單目運(yùn)算符 2 2* *:間接訪問內(nèi)存,單目運(yùn)算符:間接訪問內(nèi)存,單目運(yùn)算符3 3+/-+/-:加法:加法/ /減法運(yùn)算符,雙目運(yùn)算符減法運(yùn)算符,雙目運(yùn)算符 4 4+/-+/-:增:增1/1/減減1 1運(yùn)算符,單目運(yùn)算符運(yùn)算符,單目運(yùn)算符5 5關(guān)系運(yùn)算符:關(guān)系運(yùn)算符:,=,=,=,!= ,=,=,=,!= 2 2指針運(yùn)算指針運(yùn)算Pointer ArithmeticPointer Arithmeticv指針值的集合是地址空間

10、編碼。指針值的集合是地址空間編碼。v 在這個(gè)集合上可進(jìn)展操作運(yùn)算,所用的指在這個(gè)集合上可進(jìn)展操作運(yùn)算,所用的指針運(yùn)算符有:針運(yùn)算符有: v指針挪動(dòng)運(yùn)算指針挪動(dòng)運(yùn)算v 經(jīng)過對(duì)指針變量進(jìn)展加、減運(yùn)算實(shí)現(xiàn)對(duì)指針經(jīng)過對(duì)指針變量進(jìn)展加、減運(yùn)算實(shí)現(xiàn)對(duì)指針變量的重新定值,使指針指向不同的存儲(chǔ)單元。指變量的重新定值,使指針指向不同的存儲(chǔ)單元。指針挪動(dòng)運(yùn)算的限制條件為:針挪動(dòng)運(yùn)算的限制條件為:v 指針只能在一樣數(shù)據(jù)類型的延續(xù)空間內(nèi)挪動(dòng);指針只能在一樣數(shù)據(jù)類型的延續(xù)空間內(nèi)挪動(dòng);v 指針挪動(dòng)的內(nèi)存單位是基數(shù)據(jù)類型的邏輯單位,指針挪動(dòng)的內(nèi)存單位是基數(shù)據(jù)類型的邏輯單位,而不是字節(jié)單位。而不是字節(jié)單位。 主要運(yùn)算方式有:

11、主要運(yùn)算方式有: 指針變量指針變量+/-+/-整型表達(dá)式整型表達(dá)式 整型表達(dá)式整型表達(dá)式+ +指針變量指針變量 +/-+/-指針變量或指針變量指針變量或指針變量+/-+/- 指針變量指針變量1-1-指針變量指針變量2 2例:假設(shè)指針變量例:假設(shè)指針變量p p、q q是同類型指針,且指向同一數(shù)是同類型指針,且指向同一數(shù)據(jù)集合數(shù)組,據(jù)集合數(shù)組,n n是整型常量或變量,那么指針變是整型常量或變量,那么指針變量量p p、q q支持如下五種算術(shù)運(yùn)算:支持如下五種算術(shù)運(yùn)算:后置自加運(yùn)算:后置自加運(yùn)算:p+p+; / /* *p p作為當(dāng)前操作數(shù),然后后作為當(dāng)前操作數(shù),然后后移一個(gè)元素移一個(gè)元素* */ /

12、 后置自減運(yùn)算:后置自減運(yùn)算:p-p-; / /* *p p作為當(dāng)前操作數(shù),然后前作為當(dāng)前操作數(shù),然后前移一個(gè)元素移一個(gè)元素* */ /前置自加運(yùn)算:前置自加運(yùn)算:+p+p; / /* *p p后移一個(gè)元素,然后作為后移一個(gè)元素,然后作為當(dāng)前操作數(shù)當(dāng)前操作數(shù)* */ /前置自減運(yùn)算:前置自減運(yùn)算:-p-p; / /* *p p前移一個(gè)元素,然后作為前移一個(gè)元素,然后作為當(dāng)前操作數(shù)當(dāng)前操作數(shù) * */ /加整型量:加整型量:p+np+n; / /* *獲得獲得p p之后第之后第n n個(gè)元素的地個(gè)元素的地址址* */ /減整型量:減整型量:p-np-n; / /* *獲得獲得p p之前第之前第n

13、n個(gè)元素的地個(gè)元素的地址址* */ /同類指針相減:同類指針相減:p-qp-q; / /* *表示表示p p和和q q兩者之間的元素兩者之間的元素個(gè)數(shù)個(gè)數(shù)* */ /圖 6-4 指針變量的挪動(dòng)運(yùn)算數(shù)組數(shù)組 指針指針【例【例6-26-2】閱讀程序。留意指針變量的挪動(dòng)?!块喿x程序。留意指針變量的挪動(dòng)。#include void main( ) int a10=54,65,8,2,3,56,8,21,57,98,*p, i; p=a; for(i=0;i10;i+) printf(%4d, *p+ ); printf(n); 假設(shè)假設(shè)p p指向指向a a數(shù)組中第數(shù)組中第i i個(gè)元素,那么:個(gè)元素,那

14、么:* *p-p-相當(dāng)于相當(dāng)于* *(p-)(p-)或或 ai- ai-,先對(duì),先對(duì)p p進(jìn)展進(jìn)展“* *運(yùn)算,運(yùn)算,再使再使p p自減。自減。* *-p-p相當(dāng)于相當(dāng)于* *(-p) (-p) 或或a-ia-i,先對(duì),先對(duì)p p自減,再作自減,再作* *運(yùn)運(yùn)算。算。* *+p+p相當(dāng)于相當(dāng)于* *(+p)(+p)或或 a+i a+i,先對(duì),先對(duì)p p自加,再作自加,再作* *運(yùn)運(yùn)算。算。* *p+p+相當(dāng)于相當(dāng)于* *(p+)(p+)或或 ai+ ai+,先對(duì),先對(duì)p p進(jìn)展進(jìn)展“* *運(yùn)算,運(yùn)算,再使再使p p自加。自加。( (* *p)-p)-,先取,先取* *p p的值,再將此值自減。

15、的值,再將此值自減。-(-(* *p)p),先將,先將* *p p的值自減,再取的值自減,再取* *p p的值。的值。( (* *p)+p)+,先取,先取* *p p的值,再將此值自加。的值,再將此值自加。+(+(* *p)p),先將,先將* *p p的值自加,再取的值自加,再取* *p p的值。的值。v 關(guān)系運(yùn)算關(guān)系運(yùn)算v 只需當(dāng)兩個(gè)指針變量指向同一個(gè)延續(xù)的存只需當(dāng)兩個(gè)指針變量指向同一個(gè)延續(xù)的存儲(chǔ)空間時(shí),才干進(jìn)展關(guān)系運(yùn)算。儲(chǔ)空間時(shí),才干進(jìn)展關(guān)系運(yùn)算。v 判別兩個(gè)指針能否指向同一個(gè)存儲(chǔ)單元:判別兩個(gè)指針能否指向同一個(gè)存儲(chǔ)單元:v p=q p=q; v / /* *當(dāng)當(dāng)p p和和q q指向同一元

16、素時(shí),表達(dá)式的值為指向同一元素時(shí),表達(dá)式的值為1 1;反之為反之為0 0* */ /v p!=q p!=q; v / /* *當(dāng)當(dāng)p p和和q q不指向同一元素時(shí),表達(dá)式的值為不指向同一元素時(shí),表達(dá)式的值為1 1;反之為反之為0 0* */ /u判別不同指針?biāo)赶虻拇鎯?chǔ)單元間的位置關(guān)系:判別不同指針?biāo)赶虻拇鎯?chǔ)單元間的位置關(guān)系:u pq pq pq u / /* *當(dāng)當(dāng)p p所指的元素在所指的元素在q q所指的元素之后時(shí),所指的元素之后時(shí),表達(dá)式的值表達(dá)式的值u 為為1 1;反之為;反之為0 0。* */ /【例【例6-3】利用指針的挪動(dòng)和比較運(yùn)算,求數(shù)組】利用指針的挪動(dòng)和比較運(yùn)算,求數(shù)組in

17、t a10的的10個(gè)元素之和。個(gè)元素之和。算法思想:算法思想: 設(shè)置指針設(shè)置指針p p和和q q分別指向數(shù)組的首和尾;經(jīng)過分別指向數(shù)組的首和尾;經(jīng)過首指針向后或尾指針向前挪動(dòng),直到首、尾指針首指針向后或尾指針向前挪動(dòng),直到首、尾指針相等,即遍歷了整個(gè)數(shù)組,從而實(shí)現(xiàn)對(duì)數(shù)組的操相等,即遍歷了整個(gè)數(shù)組,從而實(shí)現(xiàn)對(duì)數(shù)組的操作。作。 #include void main() int s=0, a10, *p, *q; for( p=a+9, q=a; p=q; p- ) scanf(%d,p); q=a+9; p=a; while( p=q ) s+=*p; +p; printf(sum=%dn,s);

18、【例【例6-4】利用指針挪動(dòng)和比較運(yùn)算,編寫程序?qū)ⅰ坷弥羔樑矂?dòng)和比較運(yùn)算,編寫程序?qū)⒁粋€(gè)字符串逆置。要求在同一個(gè)數(shù)組中實(shí)現(xiàn)字符一個(gè)字符串逆置。要求在同一個(gè)數(shù)組中實(shí)現(xiàn)字符串逆置。串逆置。算法思想:算法思想: 設(shè)置設(shè)置s s和和p p兩個(gè)指針分別指向串首和串尾不兩個(gè)指針分別指向串首和串尾不是數(shù)組的首和尾,交換它們對(duì)應(yīng)的字符;是數(shù)組的首和尾,交換它們對(duì)應(yīng)的字符; 然后然后s s和和p p分別向字符串中間挪動(dòng),并同時(shí)交分別向字符串中間挪動(dòng),并同時(shí)交換對(duì)應(yīng)位置的字符;換對(duì)應(yīng)位置的字符; 直到直到s s與與p p指向一樣位置或指向一樣位置或s s指向指向p p后的位置。后的位置。#include #in

19、clude void main( ) char str50,*p,*s,c; printf(Enter string:); gets(str); p=s=str;/*指針指針p和和s同時(shí)指向同時(shí)指向str */ while(*p) p+;/*找到串終了標(biāo)志找到串終了標(biāo)志0 */ p-;/*指針回退一個(gè)字符,指向字符串中的最后一個(gè)字符指針回退一個(gè)字符,指向字符串中的最后一個(gè)字符*/ /*以上語句使以上語句使s和和p分別指向串首和串尾分別指向串首和串尾*/ while(sp)/*指針比較,指針比較,s在在p之前時(shí),進(jìn)展循環(huán)交換之前時(shí),進(jìn)展循環(huán)交換*/ c=*s;/*交換兩個(gè)指針?biāo)赶虻淖址粨Q兩個(gè)

20、指針?biāo)赶虻淖址?*/ *s+=*p;/*串前面的指針串前面的指針s向后向后+1挪動(dòng)挪動(dòng)*/ *p-= c;/*串后面的指針串后面的指針p向前向前-1挪動(dòng)挪動(dòng)*/ puts(str); 3文件指針變量的運(yùn)用選講文件指針變量的運(yùn)用選講v運(yùn)用文件指針來訪問數(shù)據(jù)文件。運(yùn)用文件指針來訪問數(shù)據(jù)文件。v指向文件的指針運(yùn)用指向文件的指針運(yùn)用FILEFILE來進(jìn)展聲明定義。來進(jìn)展聲明定義。 例:例:FILE *sensor;sensor=fopen(“sensor1.txt,“r); /*文件指針變量賦文件指針變量賦值值*/fscanf(sensor,“%f %f,&t,&motion); /

21、*運(yùn)用該文件指針運(yùn)用該文件指針*/【例【例6-5】閱讀并了解程序中的文件指針,深化學(xué)】閱讀并了解程序中的文件指針,深化學(xué) 習(xí)相應(yīng)的文件讀寫函數(shù)等。習(xí)相應(yīng)的文件讀寫函數(shù)等。#include #include void main( )FILE *fp; /*建立文件指針建立文件指針fp*/int i, k, n; if ( (fp=fopen(data.txt,w+) =NULL) printf(Open errorn);exit(0); for (i=1;i6;i+) fprintf(fp, “%d n,i); rewind(fp);/*將文件指針位置移至文件首將文件指針位置移至文件首*/ fs

22、canf(fp, %d %d,&k,&n); printf(%d %dn,k,n); fclose(fp); /*封鎖文件指針指向的數(shù)據(jù)文件封鎖文件指針指向的數(shù)據(jù)文件*/ 文件的順序讀寫:文件的順序讀寫:文件翻開時(shí),文件指針指向文件的首位置;文件翻開時(shí),文件指針指向文件的首位置;文件的讀寫是在文件指針的當(dāng)前位置進(jìn)展的;文件的讀寫是在文件指針的當(dāng)前位置進(jìn)展的;每完成一次讀寫操作,文件指針自動(dòng)下移一個(gè)位每完成一次讀寫操作,文件指針自動(dòng)下移一個(gè)位置;置;這就是文件的順序讀寫。這就是文件的順序讀寫。fscanf、fprintf等是順序等是順序文件讀寫函數(shù)。文件讀寫函數(shù)。文件的隨機(jī)讀寫:

23、文件的隨機(jī)讀寫:文件還可以進(jìn)展隨機(jī)讀寫,即指定恣意一個(gè)文件文件還可以進(jìn)展隨機(jī)讀寫,即指定恣意一個(gè)文件指針位置,然后進(jìn)展讀寫,不一定按照文件的指針位置,然后進(jìn)展讀寫,不一定按照文件的順序進(jìn)展。順序進(jìn)展。運(yùn)用改動(dòng)文件指針當(dāng)前位置的函數(shù),實(shí)現(xiàn)文件的運(yùn)用改動(dòng)文件指針當(dāng)前位置的函數(shù),實(shí)現(xiàn)文件的隨機(jī)讀寫。隨機(jī)讀寫。原型:原型: rewind(fp) rewind(fp);功能:無論文件指針當(dāng)前在何處,將文件指針的當(dāng)前位功能:無論文件指針當(dāng)前在何處,將文件指針的當(dāng)前位置置于文件的開場(chǎng)處。其中,置置于文件的開場(chǎng)處。其中,fpfp為文件指針。為文件指針。rewind函數(shù)指向文件首記錄ftell函數(shù)函數(shù)獲取文件指

24、針的當(dāng)前位置獲取文件指針的當(dāng)前位置原型:原型: long ftell(fp)功能:獲取文件指針的當(dāng)前位置。功能:獲取文件指針的當(dāng)前位置。闡明:闡明:fp為文件指針。為文件指針。ftell函數(shù)前往值為長(zhǎng)整型數(shù)據(jù),調(diào)函數(shù)前往值為長(zhǎng)整型數(shù)據(jù),調(diào)用勝利前往文件的當(dāng)前位置即相對(duì)于文件開場(chǎng)的字節(jié)用勝利前往文件的當(dāng)前位置即相對(duì)于文件開場(chǎng)的字節(jié)數(shù);調(diào)用失敗,前往數(shù);調(diào)用失敗,前往-1L。例,例,long n;n=ftell(fp);文件指針定位函數(shù)文件指針定位函數(shù) fseek函數(shù)函數(shù)指向指定位置指向指定位置普通方式為:普通方式為:fseek(fp,位置修正值位置修正值,當(dāng)前位置設(shè)定點(diǎn)當(dāng)前位置設(shè)定點(diǎn));功能:根

25、據(jù)文件指針的當(dāng)前位置設(shè)定點(diǎn)和位置修正值,將文功能:根據(jù)文件指針的當(dāng)前位置設(shè)定點(diǎn)和位置修正值,將文件指針在當(dāng)前位置設(shè)定點(diǎn)的根底上,按位置修正值進(jìn)展調(diào)件指針在當(dāng)前位置設(shè)定點(diǎn)的根底上,按位置修正值進(jìn)展調(diào)整。整。闡明:闡明:fp為文件指針;為文件指針;位置修正值是位移量,是位置修正值是位移量,是long型數(shù)據(jù),表示以當(dāng)前位置設(shè)定型數(shù)據(jù),表示以當(dāng)前位置設(shè)定點(diǎn)為起始點(diǎn)挪動(dòng)的相對(duì)值;點(diǎn)為起始點(diǎn)挪動(dòng)的相對(duì)值;當(dāng)前位置設(shè)定點(diǎn)是當(dāng)前位置設(shè)定點(diǎn)是int型數(shù)據(jù),表示挪動(dòng)的起始位置;型數(shù)據(jù),表示挪動(dòng)的起始位置;位置修正值和當(dāng)前位置設(shè)定點(diǎn)都是以字節(jié)為單位。位置修正值和當(dāng)前位置設(shè)定點(diǎn)都是以字節(jié)為單位。例如:例如: fsee

26、k(fp,100L,0); 把位置指針移到離文件首把位置指針移到離文件首100個(gè)字節(jié)處。個(gè)字節(jié)處。 fseek(fp,0,SEEK_SET); 將文件指針從文件頭開場(chǎng)向后調(diào)整將文件指針從文件頭開場(chǎng)向后調(diào)整0個(gè)字節(jié),即文件的開場(chǎng)個(gè)字節(jié),即文件的開場(chǎng)fseek(fp,-2,SEEK_END); 將文件指針從文件尾開場(chǎng)向前調(diào)整將文件指針從文件尾開場(chǎng)向前調(diào)整2個(gè)字節(jié)。個(gè)字節(jié)。 fseek(fp,-10L,1); 將文件指針從文件當(dāng)前位置開場(chǎng)向前調(diào)整將文件指針從文件當(dāng)前位置開場(chǎng)向前調(diào)整10個(gè)字節(jié)。個(gè)字節(jié)?!纠纠?-6】閱讀并了解程序中經(jīng)過文件指針操作數(shù)據(jù)?!块喿x并了解程序中經(jīng)過文件指針操作數(shù)據(jù)。#in

27、clude #include void main( ) float stu10,*q,*p,s;FILE *fp; /*建立文件指針建立文件指針*/int i;q=stu; /*q指針指向數(shù)組指針指向數(shù)組stu*/p=&s; /*p指針指向變量指針指向變量s*/if (fp=fopen(student,wb+)=NULL) /*建立指向二進(jìn)制文件的指針建立指向二進(jìn)制文件的指針fp*/printf(Open errorn);exit(0); for(i=0;i10;i+,q+) scanf(%f,q); /*指針挪動(dòng)指針挪動(dòng),輸入數(shù)組數(shù)據(jù)輸入數(shù)組數(shù)據(jù)*/q=stu;/*重置指針重置指針*

28、/fwrite(q,sizeof(float),10,fp); /*把數(shù)組中的數(shù)據(jù)分把數(shù)組中的數(shù)據(jù)分10次寫入二進(jìn)制文件中次寫入二進(jìn)制文件中*/rewind(fp);/*將文件位置指針重新移至文件首將文件位置指針重新移至文件首*/fseek(fp,2*sizeof(float),0); /*將文件指針位置移至第三個(gè)數(shù)據(jù)將文件指針位置移至第三個(gè)數(shù)據(jù)*/fread(p,sizeof(float),1,fp); /*讀取第三個(gè)數(shù)據(jù)讀取第三個(gè)數(shù)據(jù)*/printf(%f,*p); /*輸出第三個(gè)數(shù)據(jù)輸出第三個(gè)數(shù)據(jù)*/fclose(fp);/*封鎖文件封鎖文件*/(1)利用文件指針進(jìn)展數(shù)據(jù)塊輸入和輸出利用

29、文件指針進(jìn)展數(shù)據(jù)塊輸入和輸出 二進(jìn)制文件中的數(shù)據(jù)流是非字符的,二進(jìn)制文二進(jìn)制文件中的數(shù)據(jù)流是非字符的,二進(jìn)制文件的讀寫速度比文本文件高。件的讀寫速度比文本文件高。(2)二進(jìn)制文件的讀寫函數(shù)二進(jìn)制文件的讀寫函數(shù)fread函數(shù)和函數(shù)和fwrite函數(shù)函數(shù)普通方式為:普通方式為:fread(buffer, size, count, fp); /*讀讀*/fwrite(buffer, size, count, fp); /*寫寫*/ 闡明:闡明: buffer是一個(gè)指針,在是一個(gè)指針,在fread函數(shù)中,它表示存放函數(shù)中,它表示存放輸入數(shù)據(jù)的首地址。在輸入數(shù)據(jù)的首地址。在fwrite函數(shù)中,它表示存放

30、函數(shù)中,它表示存放輸出數(shù)據(jù)的首地址。輸出數(shù)據(jù)的首地址。 size表示數(shù)據(jù)塊的字節(jié)數(shù)。表示數(shù)據(jù)塊的字節(jié)數(shù)。 count表示要讀寫的數(shù)據(jù)塊塊數(shù)。表示要讀寫的數(shù)據(jù)塊塊數(shù)。 fp表示文件指針。表示文件指針。 例如:例如:fread(a,4,5,fp); 從文件指針從文件指針fp所指的文件中,每次讀所指的文件中,每次讀4個(gè)字節(jié)一個(gè)實(shí)數(shù)送入實(shí)型數(shù)組個(gè)字節(jié)一個(gè)實(shí)數(shù)送入實(shí)型數(shù)組a中,中,延續(xù)讀延續(xù)讀5次,即讀次,即讀5個(gè)實(shí)數(shù)到個(gè)實(shí)數(shù)到a中。中。fwrite(q,sizeof(float),10,fp); 把把q指針?biāo)赶驍?shù)據(jù)塊中的數(shù)據(jù)分指針?biāo)赶驍?shù)據(jù)塊中的數(shù)據(jù)分10次,以實(shí)型數(shù)據(jù)寫入次,以實(shí)型數(shù)據(jù)寫入fp所指

31、向的二進(jìn)制所指向的二進(jìn)制文件中。文件中。6.1.2 6.1.2 多級(jí)指針概念與地址關(guān)系多級(jí)指針概念與地址關(guān)系v指針是間接訪問內(nèi)存對(duì)象的手段。指針是間接訪問內(nèi)存對(duì)象的手段。v指針變量可存儲(chǔ)各種類型變量的地址指針變量可存儲(chǔ)各種類型變量的地址. .v直接指向被訪問變量對(duì)象的指針為一級(jí)指針直接指向被訪問變量對(duì)象的指針為一級(jí)指針. .v存放指針變量地址的指針變量稱為指向指針的存放指針變量地址的指針變量稱為指向指針的指針,也稱為多級(jí)指針。指針,也稱為多級(jí)指針。二級(jí)指針的定義方式如下:二級(jí)指針的定義方式如下:基類型基類型 * * *指針變量;指針變量;闡明:闡明: “ “* * *是指向指針的指針標(biāo)志,其基

32、類型是指向指針的指針標(biāo)志,其基類型是其所指向的指針指向的對(duì)象的類型。是其所指向的指針指向的對(duì)象的類型。例例: int i=3,*p1=&i; /*指針指針p1指向變量指向變量i,p1是一級(jí)指針是一級(jí)指針*/ int *p2=&p1; /*指針指針p2指向指針變量指向指針變量p1,p2是二級(jí)指針是二級(jí)指針*/int *p2 可了解為可了解為int *(*p2) *p2表示表示p2是個(gè)指針變量是個(gè)指針變量;第一個(gè)第一個(gè)*表示表示p2指向的指向的是一個(gè)指針變量是一個(gè)指針變量;基類型基類型int表示這個(gè)二級(jí)指針最終表示這個(gè)二級(jí)指針最終指向個(gè)整型變量指向個(gè)整型變量 基類型基類型留意:留意

33、: (1) p1、p2都是指針變量都是指針變量; 但但p1只能指向整型變量,只能指向整型變量,p2只能指向基類型是只能指向基類型是整型的指針變量,而不能指向其它任何非指針類整型的指針變量,而不能指向其它任何非指針類型的變量。型的變量。 p2=&i; 是不合法的。是不合法的。 p1=p2; 是不合法的。是不合法的。 p2=p1; 是不合法的。是不合法的。 由于由于p1和和p2是兩種基類型不同的指針。是兩種基類型不同的指針。 (2)程序設(shè)計(jì)中,不常用多級(jí)指針訪問簡(jiǎn)單變量程序設(shè)計(jì)中,不常用多級(jí)指針訪問簡(jiǎn)單變量。 (3)二二/多級(jí)指針主要用于多維數(shù)組、指針數(shù)組以多級(jí)指針主要用于多維數(shù)組、指針數(shù)

34、組以及函數(shù)參數(shù)傳送等。及函數(shù)參數(shù)傳送等。6.2 利用指針訪問數(shù)組利用指針訪問數(shù)組6.2.1 6.2.1 指向一維數(shù)組和數(shù)組元素的指針指向一維數(shù)組和數(shù)組元素的指針6.2.2 6.2.2 指向二多維數(shù)組和數(shù)組元素的指針指向二多維數(shù)組和數(shù)組元素的指針 利用指針援用數(shù)組元素往往比利用下標(biāo)援利用指針援用數(shù)組元素往往比利用下標(biāo)援用數(shù)組元素運(yùn)轉(zhuǎn)速度要快。用數(shù)組元素運(yùn)轉(zhuǎn)速度要快。 v 指向一維數(shù)組的指針指向一維數(shù)組的指針6.2.1 6.2.1 指向一維數(shù)組和數(shù)組元素的指針指向一維數(shù)組和數(shù)組元素的指針v建立指向數(shù)組的指針,即獲得數(shù)組的首地址:數(shù)組名。建立指向數(shù)組的指針,即獲得數(shù)組的首地址:數(shù)組名。u一維數(shù)組的邏

35、輯構(gòu)造與存儲(chǔ)構(gòu)造一致,指向一維數(shù)組的一維數(shù)組的邏輯構(gòu)造與存儲(chǔ)構(gòu)造一致,指向一維數(shù)組的指針也指向第一個(gè)元素,所以指向一維數(shù)組的指針是一指針也指向第一個(gè)元素,所以指向一維數(shù)組的指針是一級(jí)指針。級(jí)指針。u例:例:int m10, int m10, * *p=m; p=m; u從存儲(chǔ)構(gòu)造上看,指向數(shù)組的指針是按行操作的,但一維數(shù)組從存儲(chǔ)構(gòu)造上看,指向數(shù)組的指針是按行操作的,但一維數(shù)組只需一行。只需一行。 2. 2. 指向數(shù)組元素的指針指向數(shù)組元素的指針v所謂指向數(shù)組元素的指針,即獲得某元素的地址。所謂指向數(shù)組元素的指針,即獲得某元素的地址。u一維數(shù)組是經(jīng)過一維數(shù)組是經(jīng)過“數(shù)組名數(shù)組名+ +下標(biāo)位置下標(biāo)

36、位置獲得元素的獲得元素的地址。地址。u例,例,float n10,float n10,* *p,p,* *q;q;u p=&n0; p=&n0;u q=&n9; q=&n9;u從存儲(chǔ)構(gòu)造上看,指向數(shù)組元素的指針是按列操作的。從存儲(chǔ)構(gòu)造上看,指向數(shù)組元素的指針是按列操作的。v一維數(shù)組的數(shù)組名和第一個(gè)數(shù)組元素的地址是一維數(shù)組的數(shù)組名和第一個(gè)數(shù)組元素的地址是等價(jià)的。但前者是由等價(jià)的。但前者是由m m直接獲得,后者是由直接獲得,后者是由m+0m+0計(jì)算后獲得。首先,它們獲得地址的速度是不計(jì)算后獲得。首先,它們獲得地址的速度是不同的;其次,含義也不一樣。同的;其次,含義也

37、不一樣。m m是指向一維數(shù)是指向一維數(shù)組的指針行,組的指針行,m+0m+0是指向數(shù)組元素的指針是指向數(shù)組元素的指針列。列。m+0m+0把數(shù)組行地址指針變換為數(shù)把數(shù)組行地址指針變換為數(shù)組元素的列地址。組元素的列地址。 #include void main() int a10,i,*p=a; for(i=0;i10;i+ ) scanf(%d,&ai); /*下標(biāo)法訪問下標(biāo)法訪問*/ for(i=0;i10;i+ ) printf(%5d,ai); /*下標(biāo)法訪問數(shù)組元素下標(biāo)法訪問數(shù)組元素*/ printf(n); for ( i=0;i10;i+ ) printf(%5d,pi); /*

38、指針下標(biāo)法指針下標(biāo)法*/ printf(n); for ( i=0;i10;i+ ) printf(%5d,*(a+i); /*地址法訪問數(shù)組元素地址法訪問數(shù)組元素*/ printf(n); for( ;p(a+10);p+ ) printf(%5d,*p); /*指針法訪問數(shù)組元素指針法訪問數(shù)組元素*/ printf(n); p=&a0; for( i=0;i10;i+ ) printf(%5d,*(p+i); /*指針法訪問數(shù)組元素指針法訪問數(shù)組元素*/ 【例【例6-7】閱讀并了解程序中訪問數(shù)組元素的各種方法?!块喿x并了解程序中訪問數(shù)組元素的各種方法。假設(shè)運(yùn)用假設(shè)運(yùn)用ai或或*(a

39、+i)訪問數(shù)組元素,執(zhí)行效率是一樣訪問數(shù)組元素,執(zhí)行效率是一樣的。的。C編譯系統(tǒng)是將編譯系統(tǒng)是將ai轉(zhuǎn)換為轉(zhuǎn)換為*(a+i)來處置的。即經(jīng)過數(shù)來處置的。即經(jīng)過數(shù)組首地址計(jì)算出數(shù)組元素地址,然后取出數(shù)組元素的值。組首地址計(jì)算出數(shù)組元素地址,然后取出數(shù)組元素的值。這兩種方法計(jì)算數(shù)組元素費(fèi)時(shí)較多。這兩種方法計(jì)算數(shù)組元素費(fèi)時(shí)較多。用指針變量直接指向數(shù)組元素,不用每次都重新計(jì)算用指針變量直接指向數(shù)組元素,不用每次都重新計(jì)算地址,像地址,像p+這樣的自加操作是比較快的。這種有規(guī)律地這樣的自加操作是比較快的。這種有規(guī)律地改動(dòng)地址值改動(dòng)地址值(p+)能大大提高執(zhí)行效率。能大大提高執(zhí)行效率。用下標(biāo)法比較直觀,能

40、直接知道是第幾個(gè)數(shù)組元素。用下標(biāo)法比較直觀,能直接知道是第幾個(gè)數(shù)組元素。例如,例如,a5是數(shù)組中下標(biāo)為是數(shù)組中下標(biāo)為5的元素。用地址法或指針變的元素。用地址法或指針變量法不直觀,難以很快地判別出當(dāng)前處置的是哪一個(gè)數(shù)組量法不直觀,難以很快地判別出當(dāng)前處置的是哪一個(gè)數(shù)組元素。要仔細(xì)分析指針變量元素。要仔細(xì)分析指針變量p的當(dāng)前指向,才干判別當(dāng)前的當(dāng)前指向,才干判別當(dāng)前輸出的是第幾個(gè)數(shù)組元素。輸出的是第幾個(gè)數(shù)組元素。 程序分析程序分析3. 3. 指向一維字符數(shù)組指向一維字符數(shù)組/ /字符串的指針字符串的指針例,建立一個(gè)指向一維字符數(shù)組的指針:例,建立一個(gè)指向一維字符數(shù)組的指針:char str10=

41、a,b,c,d,*p;p=str; /*經(jīng)過經(jīng)過str獲得字符數(shù)組的地址,等價(jià)于獲得字符數(shù)組的地址,等價(jià)于p=&str0*/puts(p); /*p是指向數(shù)組的指針,等價(jià)于是指向數(shù)組的指針,等價(jià)于pus(str) */例,建立一個(gè)指向字符串常量的指針。例,建立一個(gè)指向字符串常量的指針。char *p=microsoft; /*指向字符串常量中的首字符指向字符串常量中的首字符*/printf(%s,p); /*經(jīng)過指針操作字符串常量經(jīng)過指針操作字符串常量*/等價(jià)于等價(jià)于char *p;p=microsoft; /*指向字符串中首字符的字符指針指向字符串中首字符的字符指針*/ printf

42、(%s,p);v字符串常量有特定的存儲(chǔ)區(qū)域,將一個(gè)字符串常量字符串常量有特定的存儲(chǔ)區(qū)域,將一個(gè)字符串常量賦給一個(gè)字符指針變量時(shí),編譯系統(tǒng)將自動(dòng)把字符賦給一個(gè)字符指針變量時(shí),編譯系統(tǒng)將自動(dòng)把字符串常量的存儲(chǔ)區(qū)首地址賦給指針變量,使指針指向串常量的存儲(chǔ)區(qū)首地址賦給指針變量,使指針指向該字符串。該字符串。#include #include void main( ) char str180, str280, *p1=str1, *p2=str2; printf(Enter string 1:); gets(p1); while(*p2=*p1)!= 0 ) p1+; p2+; /*指針指針p1和和p2

43、分別向后挪動(dòng)分別向后挪動(dòng)1個(gè)字符個(gè)字符*/ p2=str2; /*指針指針p2重新賦值重新賦值*/ printf(string 2:); puts(p2); 【例【例6-8】利用指針編程,將字符串】利用指針編程,將字符串str1復(fù)制到字符復(fù)制到字符串串str2中。中。while (*p2=*p1) p1+; p2+; while (*p2+ = *p1+) ; 分析:分析:1問題陳說:要求用戶可以從鍵盤輸入一篇英文摘要。問題陳說:要求用戶可以從鍵盤輸入一篇英文摘要。2需求分析:從鍵盤輸入一篇英文摘要并輸出。應(yīng)該可需求分析:從鍵盤輸入一篇英文摘要并輸出。應(yīng)該可以處置有多個(gè)段落的文章。以處置有多個(gè)

44、段落的文章。3處置過程和算法分析:處置過程和算法分析:本問題要編程實(shí)現(xiàn)本問題要編程實(shí)現(xiàn)“文本編輯器的文本文本編輯器的文本“新建、新建、“輸入和輸入和“顯示功能。顯示功能。利用字符數(shù)組串存放一個(gè)文章段落。利用字符數(shù)組串存放一個(gè)文章段落。利用字符指針和一維字符數(shù)組的指針及文件指針輸入文利用字符指針和一維字符數(shù)組的指針及文件指針輸入文章并存入文本文件。在程序中將運(yùn)用文件字符串輸入輸出章并存入文本文件。在程序中將運(yùn)用文件字符串輸入輸出fgets和和fputs函數(shù)。函數(shù)。 【運(yùn)用案例【運(yùn)用案例6-1】運(yùn)用指針和數(shù)組為某論文輸入一篇英】運(yùn)用指針和數(shù)組為某論文輸入一篇英文摘要。文摘要。算法偽代碼描畫:算法偽

45、代碼描畫:/*算法開場(chǎng)算法開場(chǎng)*/文件指針定義;文件指針定義;段落數(shù)組定義,用字符指針指向該數(shù)組;段落數(shù)組定義,用字符指針指向該數(shù)組;新建或翻開文本文件;新建功能新建或翻開文本文件;新建功能利用指針從鍵盤輸入文章利用指針從鍵盤輸入文章:(程序中最多可以輸入程序中最多可以輸入10個(gè)段落,輸入功能實(shí)現(xiàn)個(gè)段落,輸入功能實(shí)現(xiàn))for(i=0;i10;i+) gets(s2);/*輸入第輸入第i+1句句*/strcat(str2,n);/*銜接回車銜接回車*/fputs(str2,fp); /*輸出到文件輸出到文件*/ 重新定位文件指針到文件首;重新定位文件指針到文件首;利用指針從文件輸出并顯示文章利用

46、指針從文件輸出并顯示文章:(輸出功能實(shí)現(xiàn)輸出功能實(shí)現(xiàn))for(i=0;i10;i+)fgets(s2,100,fp); /*從文件取回的字符串從文件取回的字符串*/printf(%s,s2);/*經(jīng)過指針輸出字符串經(jīng)過指針輸出字符串*/*算法終了算法終了*/#include #include #include void main(void)int i;FILE *fp; /*定義文件指針定義文件指針*/char *str1=This is a test:The Abstract of Treatise char *s2,str2100; /*字符數(shù)組存放一個(gè)文章段落字符數(shù)組存放一個(gè)文章段落*/

47、s2=str2;printf(n從鍵盤輸入一篇文章的摘要從鍵盤輸入一篇文章的摘要:nn);if(fp=fopen(abstr.txt,w+)=NULL) printf(Open errorn); exit(0); /*文件指針指向文件指針指向abstr.txt*/*把字符串寫入文件把字符串寫入文件*/fputs(str1,fp); fputs(n,fp); /*存入回車存入回車*/for(i=0;i10;i+) /*最多可以輸入最多可以輸入10個(gè)段落個(gè)段落*/printf(第第%d句句:,i+1);gets(s2); /*經(jīng)過指針輸入字符串經(jīng)過指針輸入字符串*/strcat(str2,n);

48、/*鏈接回車鏈接回車*/fputs(str2,fp); /*輸出該句到文件輸出該句到文件*/fseek(fp,0,SEEK_SET); /*重新定位文件指針重新定位文件指針*/*從文件中獲得字符串并輸出從文件中獲得字符串并輸出*/printf(n這篇文章的摘要是:這篇文章的摘要是:nn);for(i=0;i10;i+)fgets(s2,100,fp);/*s2指針指向從文件取回的字符串指針指向從文件取回的字符串*/printf(%s,s2); /*經(jīng)過指針輸出字符串經(jīng)過指針輸出字符串*/fclose(fp);6.2.2 6.2.2 指向二多維數(shù)組和數(shù)組元素的指針指向二多維數(shù)組和數(shù)組元素的指針

49、1 1指向二維數(shù)組元素的指針指向二維數(shù)組元素的指針例:例:int x33=1,2,3,4,5,6,7,8,9;v 從內(nèi)存管理而言,二維數(shù)組是按行優(yōu)先順序存放的從內(nèi)存管理而言,二維數(shù)組是按行優(yōu)先順序存放的v 指向二維數(shù)組元素的指針是一級(jí)指針。指向二維數(shù)組元素的指針是一級(jí)指針。 例:例:int *pd=&x00; *(pd+k)、*pd+、*(pd+行元素個(gè)數(shù)行元素個(gè)數(shù)*行號(hào)行號(hào)+列號(hào)列號(hào))等均可援用等均可援用二維數(shù)組元素。二維數(shù)組元素。 【例【例6-9】閱讀并了解程序中援用二維數(shù)組元素的方法。】閱讀并了解程序中援用二維數(shù)組元素的方法。#include #include #include

50、void main(void)int x33=1,2,3,4,5,6,7,8,9, k, i;int *pd=&x00; /*pd指向二維數(shù)組首元素指向二維數(shù)組首元素,一級(jí)指針一級(jí)指針*/k=5;printf(%dn,*(pd+k); /*二維數(shù)組轉(zhuǎn)換為一維二維數(shù)組轉(zhuǎn)換為一維,pd+k指向指向pd指針之后第指針之后第5個(gè)元素個(gè)元素*/*pd+;/*先取先取*pd的值的值,再使指針再使指針pd自加自加,指向第二個(gè)元素指向第二個(gè)元素*/printf(%dn,*(pd+k); /*留意留意pd當(dāng)前值當(dāng)前值*/ pd-; /*pd又前往指向數(shù)組首元素又前往指向數(shù)組首元素*/printf(%dn

51、,*(pd+3*1+2); /*輸出第輸出第2行的第行的第3個(gè)元素個(gè)元素*/scanf(%d,pd+3*1+2); /*輸入第輸入第2行的第行的第3個(gè)元素個(gè)元素*/ printf(%dnn,*(pd+3*1+2); /*輸出第輸出第2行的第行的第3個(gè)元素個(gè)元素*/for(i=0;i9;i+) printf(%d ,*pd+); /*用元素指針遍歷二維數(shù)組用元素指針遍歷二維數(shù)組*/2 2指向二維數(shù)組的指針指向二維數(shù)組的指針行指針快速操作數(shù)組法行指針快速操作數(shù)組法v 二多維數(shù)組按廣義一維數(shù)組管理。二多維數(shù)組按廣義一維數(shù)組管理。v 行元素即二維數(shù)組的一行。行元素是一級(jí)指針。行元素即二維數(shù)組的一行。行

52、元素是一級(jí)指針。v 指向行元素的指針就叫行指針指向行元素的指針就叫行指針 例例: 二維數(shù)組二維數(shù)組x33的行元素分別是的行元素分別是x0、x1、x2,行元素,行元素是一級(jí)指針,各自指向或代表有是一級(jí)指針,各自指向或代表有3列的一個(gè)行數(shù)組。列的一個(gè)行數(shù)組。v 行指針定義方式如下:行指針定義方式如下:v 基數(shù)據(jù)類型基數(shù)據(jù)類型 *指針名指針名列元素個(gè)數(shù)列元素個(gè)數(shù);例,例,int (*p)3;闡明:闡明: 運(yùn)算符運(yùn)算符“( )與與“ 的優(yōu)先級(jí)一樣,結(jié)合方向一樣,的優(yōu)先級(jí)一樣,結(jié)合方向一樣,所以所以p先與先與“*號(hào)結(jié)合,闡明號(hào)結(jié)合,闡明p是一個(gè)指針變量,是一個(gè)指針變量, 然后然后p再與再與“ 結(jié)合,闡明

53、該指針變量指向一個(gè)有結(jié)合,闡明該指針變量指向一個(gè)有3個(gè)元素的一維數(shù)組。個(gè)元素的一維數(shù)組。 基數(shù)據(jù)類型基數(shù)據(jù)類型int闡明了數(shù)組元素的數(shù)據(jù)類型。闡明了數(shù)組元素的數(shù)據(jù)類型。 二維數(shù)組的行元素是一級(jí)指針,指向行元素的行指針即二維數(shù)組的行元素是一級(jí)指針,指向行元素的行指針即為二級(jí)指針。為二級(jí)指針。 行指針與二維數(shù)組名性質(zhì)一樣,經(jīng)過行指針可以訪問行指針與二維數(shù)組名性質(zhì)一樣,經(jīng)過行指針可以訪問二維數(shù)組。二維數(shù)組。例如,有以下語句組:例如,有以下語句組:int a34, (*p)4; /*行指針行指針*/int i, j;p=a; /*行指針行指針p指向二維數(shù)組指向二維數(shù)組,第第1個(gè)行元素個(gè)行元素*/p+;

54、 /*行指針行指針p下移下移1行,指向第行,指向第2個(gè)行元素個(gè)行元素*/p+; /*行指針行指針p下移下移1行,指向第行,指向第3個(gè)行元素個(gè)行元素*/ 當(dāng)行指針當(dāng)行指針p指向二維數(shù)組指向二維數(shù)組a后,用后,用a表示表示i行行j列數(shù)組元素的方列數(shù)組元素的方式都可以用式都可以用p交換。交換。 用用p表示表示aij的方式有:的方式有: pij、*(pi+j)、*(*(p+i)+j)、(*(p+i)j。 p和和a的差別在于:的差別在于:p是變量可以改動(dòng),是變量可以改動(dòng),a是常量不能改動(dòng)。是常量不能改動(dòng)。 【例【例6-10】假設(shè)有某數(shù)組】假設(shè)有某數(shù)組a45,從鍵盤輸入該數(shù)組各,從鍵盤輸入該數(shù)組各元素的值

55、,然后運(yùn)用行指針設(shè)計(jì)并處理以下問題。元素的值,然后運(yùn)用行指針設(shè)計(jì)并處理以下問題。1計(jì)算第計(jì)算第2行的數(shù)據(jù)和行求和問題行的數(shù)據(jù)和行求和問題2計(jì)算第計(jì)算第3列的數(shù)據(jù)和列求和問題列的數(shù)據(jù)和列求和問題3求前求前3行數(shù)據(jù)中的最大值二維數(shù)組求極值行數(shù)據(jù)中的最大值二維數(shù)組求極值4求后求后4列數(shù)據(jù)中的最小值二維數(shù)組求極值列數(shù)據(jù)中的最小值二維數(shù)組求極值5查詢并輸出某一指定值的位置二維數(shù)組的定查詢并輸出某一指定值的位置二維數(shù)組的定位與查詢位與查詢 分析:分析:1 1問題陳說和需求分析:利用行指針指向二維數(shù)組,經(jīng)問題陳說和需求分析:利用行指針指向二維數(shù)組,經(jīng)過行指針對(duì)二維數(shù)組進(jìn)展各種處置,實(shí)現(xiàn)以上功能。過行指針對(duì)二

56、維數(shù)組進(jìn)展各種處置,實(shí)現(xiàn)以上功能。2 2處置流程處置流程 定義行指針定義行指針p p,讓,讓p p指向數(shù)組指向數(shù)組a a。 經(jīng)過循環(huán)輸入、輸出各數(shù)組元素。經(jīng)過循環(huán)輸入、輸出各數(shù)組元素。 計(jì)算并輸出第計(jì)算并輸出第2 2行的數(shù)據(jù)和。行的數(shù)據(jù)和。 計(jì)算并輸出第計(jì)算并輸出第3 3列的數(shù)據(jù)和。列的數(shù)據(jù)和。 找出并輸出前找出并輸出前3 3行數(shù)據(jù)中的最大值。行數(shù)據(jù)中的最大值。 找出并輸出后找出并輸出后4 4列數(shù)據(jù)中的最小值。列數(shù)據(jù)中的最小值。 找出并輸出指定值的位置。找出并輸出指定值的位置。#include stdio.h#define N 4#define M 5void main() int aNM,(

57、*p)M,sum1=0,sum2=0,max,min,i,j,x,k=0; /*k為標(biāo)志變量為標(biāo)志變量*/ p=a;printf(請(qǐng)輸入二維數(shù)組的各元素:請(qǐng)輸入二維數(shù)組的各元素:n); for(i=0;iN;i+) for(j=0;jM;j+) scanf(%d,pi+j); printf(請(qǐng)輸入待尋覓的數(shù):請(qǐng)輸入待尋覓的數(shù):n); scanf(%d,&x); printf(二維數(shù)組各元素如下:二維數(shù)組各元素如下:n); for(i=0;iN;i+) for(j=0;jM;j+) printf(%d ,*(pi+j); printf(n); printf(二維數(shù)組第二維數(shù)組第2行元素的

58、和值如下:行元素的和值如下:n);for(i=0;iM;i+) sum1=*(p1+i)+sum1;printf(%dn,sum1); printf(二維數(shù)組第二維數(shù)組第3列元素的和值如下:列元素的和值如下:n); for(i=0;iN;i+) sum2=*(pi+2)+sum2; printf(%dn,sum2); printf(二維數(shù)組前二維數(shù)組前3行元素的最大值如下:行元素的最大值如下:n); max=*p0; /*假定第一行第一列的元素最大假定第一行第一列的元素最大*/ for(i=0;i3;i+) for(j=0;jM;j+) if(max*(pi+j) max=*(pi+j); p

59、rintf(%dn,max); printf(二維數(shù)組后二維數(shù)組后4列元素的最小值如下:列元素的最小值如下:n); min=*(p0+1); /*假定第一行第二列的元素最小假定第一行第二列的元素最小*/ for(i=0;iN;i+) for(j=1;j*(pi+j) min=*(pi+j); printf(%dn,min); for(i=0;iN;i+) for(j=0;jM;j+)if(x=*(pi+j) printf(該數(shù)所在的位置:第該數(shù)所在的位置:第%d行第行第%d列列n,i+1,j+1); k=1; if (k=1) break; /*找到那么退出循環(huán)找到那么退出循環(huán)*/ if(i=

60、N) printf(沒有該數(shù)沒有該數(shù));6.3 指針數(shù)組指針數(shù)組(pointer Array)6.3.1 6.3.1 指針數(shù)組定義與闡明指針數(shù)組定義與闡明6.3.2 6.3.2 指針數(shù)組與二維數(shù)值數(shù)組指針數(shù)組與二維數(shù)值數(shù)組6.3.3 6.3.3 指針數(shù)組與文本字符串處置指針數(shù)組與文本字符串處置6.3.46.3.4* * 工程義務(wù):用指針數(shù)組實(shí)現(xiàn)學(xué)生成果管理工程義務(wù):用指針數(shù)組實(shí)現(xiàn)學(xué)生成果管理6.3.1 6.3.1 指針數(shù)組定義與闡明指針數(shù)組定義與闡明v 指針數(shù)組是指針變量的集合,每一個(gè)數(shù)組元素都是指針指針數(shù)組是指針變量的集合,每一個(gè)數(shù)組元素都是指針變量,且都具有一樣的存儲(chǔ)類別和基類型。變量,且都具有一樣的存儲(chǔ)類別和基類型。 v 最常用的是一維指針數(shù)組,常用于處置二維數(shù)組或多個(gè)最常用的是一維指針數(shù)組,常用于處置二維數(shù)組或多個(gè)字符串。字符串。 v普通方式為:普通方式為: v 存儲(chǔ)類型存儲(chǔ)類型 基類型基類

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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)論