




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第十章 指針,指針是C語言中的一個(gè)概念,正確而靈活地運(yùn)用指針,可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)、難動(dòng)態(tài)分配內(nèi)存、方便使用字符串和數(shù)組、能使函數(shù)返回一個(gè)以上的結(jié)果、能直接使用內(nèi)存地址等。,本章內(nèi)容包括: 10.1 地址和指針的概念 10.2 變量的指針和指向變量的指針變量 10.3 數(shù)組與指針10.4 字符串與指針 10.5 指向函數(shù)的指針 10.6 返回指針值的函數(shù)10.7 指針數(shù)組與指向指針的指針,10.1地址和指針的概念,一、指針概述: 1、地址的概念與取地址運(yùn)算: 內(nèi)存以字節(jié)編碼,每個(gè)編碼都是一個(gè)地址。我們?cè)葘W(xué)過的變量、數(shù)組、函數(shù)等都放在內(nèi)存中,在程序中,我們是通過變量名等使用變量、給變量
2、賦值等,但實(shí)際運(yùn)行時(shí),系統(tǒng)使用的是內(nèi)存地址,而不是變量名。我們?cè)鯓又罊C(jī)器將某種數(shù)據(jù)放在內(nèi)存的什么地方呢?可用求地址運(yùn)算符 看出其地址。注意,這個(gè)地址并不是始終不變的,這是由機(jī)器和操作系統(tǒng)來安排的,我們無法預(yù)先知道。,在數(shù)組中,數(shù)組名代表數(shù)組的首地址 故a表示的地址和 scanf(%d,時(shí),存取變量i值的方式可以有兩種:,(1)直接訪問直接利用變量的地址進(jìn)行存取 1)上例中scanf(%d,得到。此時(shí),指針變量i_pointer的值就是變量i在內(nèi)存中的起始地址2000,如圖10-1所示。 通過指針變量i_pointer存取變量i值的過程如下: 首先找到指針變量i_pointer的地址(3010
3、),取出其值2000(正好是變量i 的起始地址); 然后從2000、2001中取出變量i的值(3)。 (3)兩種訪問方式的比較 兩種訪問方式之間的關(guān)系,可以用某人甲(系統(tǒng))要找某人乙(變量)來類比。 一種情況是,甲知道乙在何處,直接去找就是(即直接訪問)。 另一種情況是,甲不知道乙在哪,但丙(指針變量)知道,此時(shí)甲可以這么做:先找丙,從丙處獲得乙的去向,然后再找乙(即間接訪問)。,10.2 變量的指針和指向變量的指針變量,(1)指針即地址 一個(gè)變量的地址稱為該變量的指針。通過變量的指針能夠找到該變量。 (2)指針變量專門用于存儲(chǔ)其它變量地址的變量 指針變量i_pointer的值就是變量i的地址
4、。指針與指針變量的區(qū)別,就是變量值與變量的區(qū)別。 (3)為表示指針變量和它指向的變量之間的關(guān)系,用指針運(yùn)算符*表示。 例如,指針變量i_pointer與它所指向的變量i的關(guān)系,表示為: *i_pointer,即*i_pointer等價(jià)于變量i。 因此,下面兩個(gè)語句的作用相同: i=3; /*將3直接賦給變量i*/ i_pointer= /*將3賦給指針變量i_pointer所指向的變量*/,10.2.1定義一個(gè)指針變量,指針變量的定義一般形式為: 基類型*指針變量名;,例如: int i, j, *pi, *pj; float x, y, *p1, *p2; 指針變量的賦值:使得指針變量指向變
5、量 指針變量名 注意:指針變量只能存放指針(地址),且只能是相同類型變量的地址。 例如,指針變量pi、pj,只能接收int型、p1, p2只能接收float型的地址,否則出錯(cuò)。,10.2.2指針變量的引用,在程序中,可以用:*指針變量名代替其所指變量。如若 int i, *p; p=的作用相同,即可用*p代替i,這里*號(hào)稱為指針運(yùn)算符(或稱為間接訪問運(yùn)算符),例10.1通過指針變量訪問整型變量 main() int a, b, point_1, point_2; a=100; b=10; point_1=,例10.2輸入a和b兩個(gè)整數(shù),按先大后小的順序輸出a和b的值 main() int a,
6、 b, *p, *p1, *p2; p1= ,10.2.3 指針變量作為函數(shù)參數(shù),實(shí)參:變量地址或已賦值的指針變量,形參:指針變量 功能:地址傳送方式,會(huì)將改變后的值帶回。,例10.3通過函數(shù)調(diào)用實(shí)現(xiàn)例10.2的功能。 swap(int *p1, int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; main() int a, b, *pointer1,*pointer2; scanf(%d%d, ,例10.4輸入3個(gè)整數(shù),按降序(從大到小的順序)輸出。要求使用變量的指針作函數(shù)調(diào)用的實(shí)參來實(shí)現(xiàn)。 void exchange(int *pointer1,
7、 int *pointer2) int temp; temp=*pointer1, *pointer1=*pointer2, *pointer2=temp; main() int a,b,c; printf(Input the first number: ); scanf(%d, ,10.3數(shù)組與指針,10.3.1指向數(shù)組元素的指針 1.概念 數(shù)組的指針數(shù)組在內(nèi)存中的起始地址,用數(shù)組名表示 2.指向數(shù)組的指針變量-賦于數(shù)組名的指針變量 例如,int a 10, *p=a (或*p=,10.3.2 通過指針引用數(shù)組元素 如果有“int a 10,*p=a;” ,則: (1)p+i=a+i= fo
8、r(i=0;i10;i+) scanf(%d, /用指針變量指向數(shù)組元素 ,說明: (1)指針變量的值是可以改變的,所以必須注意其當(dāng)前值,否則容易出錯(cuò)。 (2)指向數(shù)組的指針變量,可以指向數(shù)組以后的內(nèi)存單元,雖然沒有實(shí)際意義。 (3)對(duì)指向數(shù)組的指針變量(px和py)進(jìn)行算術(shù)運(yùn)算和關(guān)系運(yùn)算的含義如下: 1)可以進(jìn)行的算術(shù)運(yùn)算,只有以下幾種: pxn:將指針從當(dāng)前位置向前(+n)或回退(-n)n個(gè)數(shù)據(jù)單位,而不是n個(gè)字節(jié)。 px-py:兩指針之間的數(shù)據(jù)個(gè)數(shù),而不是指針的地址之差。,2)關(guān)系運(yùn)算 表示兩個(gè)指針?biāo)傅刂分g、位置的前后關(guān)系:前者為小,后者為大。 例如,如果指針px所指地址在指針py所
9、指地址之前,則pxpy的值為1。,例:通過指針變量輸出數(shù)組的10個(gè)元素 #include void main() int *p,i,a10; p=a; for(i=0;i10;i+) scanf(%d,p+); printf(n); for(i=0;i10;i+) printf(%5d,ai); printf(n); for(i=0;i10;i+,p+) printf(t%d,*p); printf(n); ,10.3.3 用數(shù)組名作為函數(shù)參數(shù) 形參:數(shù)組或指針變量 實(shí)參:數(shù)組名或指向數(shù)組的指針變量 傳遞方式:地址傳送方式 作用:若函數(shù)中對(duì)數(shù)組作了修改,則調(diào)用函數(shù)中的數(shù)組也會(huì)作同樣的修改,例1
10、0.7將數(shù)組a中的n個(gè)整數(shù)按相反次序存放,#include void main() int i, a10=0,1,2,3,4,5,6,7,8,9,*p; void inv(int x,int n); for(i=0;i10;i+) printf(%5d,ai); printf(n);p=a; inv(a,10);inv(p,10); for(i=0;i10;i+) printf(%5d,ai); ,void inv(int *x, int n) int temp,*i,*j,*p,m=(n-1)/2; i=x;j=x+n-1;p=x+m; for(;i=p;i+,j-) temp=*i; *i
11、=*j; *j=temp; ,void inv(int x, int n) int temp,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-i-1; temp=xi; xi=xj; xj=temp; ,10.3.4 多維數(shù)組與指針 1. 多維數(shù)組元素的地址 假設(shè)有如下數(shù)組定義語句: int a 34; (1)從2維數(shù)組角度看,數(shù)組名a代表數(shù)組的起始地址, 是一個(gè)以行為單位進(jìn)行控制的行指針: a+i:行指針值,指向2維數(shù)組的第i行。 *(a+i):(列)指針值( int *p; for(p=a0;pa0+12;p+) if(p-a0)%4=0)printf(n); pri
12、ntf(%4d,*p); ,例10.12輸出二維數(shù)組的任一行任一列的值 #include void main() int a34=1,3,5,7,9,11,13,15,17,19,21,23; int (*p)4,i,j;/定義一個(gè)指向含有4個(gè)元素的整型數(shù)組 p=a; scanf(i=%d,j=%d, ,3.指向數(shù)組的指針作為函數(shù)參數(shù),例10.13有一個(gè)班,3個(gè)學(xué)生,各學(xué)4門課程,計(jì)算總1平均分?jǐn)?shù)及輸出第n個(gè)學(xué)生的成績(jī)。 算法設(shè)計(jì): 主函數(shù):1,函數(shù)聲明 2,初始化成績(jī) 3,調(diào)用求平均成績(jī)的函數(shù) 4,調(diào)用函數(shù)輸出第i個(gè)學(xué)生的成績(jī) 求平均值函數(shù): 1,求總成績(jī) 2,返回平均成績(jī) 輸出函數(shù) 使用f
13、or循環(huán),直接輸出成績(jī),#include void main( ) void average(float *p,int n); void search(float (*p)4, int n); float score34=65,67,70,60,80,87,90,81,90,99,100,98; average(*score,12); search(score,2); void average(float *p,int n) float *p_end; float sum=0,aver; p_end=p+n-1;,for(;p=p_end;p+) sum=sum+(*p); aver=sum/
14、n; printf(average=%5.2f,aver); void search(float (*p)4, int n) int i; printf(The score of NO:%dn,n); for(i=0;i4;i+) printf(%5.2f,*(*(p+n)+i); ,10.4 字符串與指針,10.4.1字符串的表示形式 1,用數(shù)組存放一個(gè)字符串 例10.15定義一個(gè)字符數(shù)組,對(duì)它進(jìn)行初始化,然后輸出該字符串。 #include void main() char string=I love China); printf(%s,string); ,2,用字符指針指向一個(gè)字符串。
15、例10.16 #include void main() char *string=I love China; printf(%s,string); ,10.4.2 字符串指針作為函數(shù)參數(shù) 例10.20用函數(shù)調(diào)用實(shí)現(xiàn)字符串的復(fù)制 #include void copy_string (char *from, char *to) for(; (*to=*from)!=0; from+, to+) ; void main() void copy_string (char *from, char *to); char array_str120=I am a teacher.; char array_st
16、r220; copy_string(array_str1, array_str2); /*數(shù)組名作實(shí)參*/ printf(array_str2=%sn, array_str2); ,程序說明: for(; (*to=*from)!=0; from+, to+) ; 語句的執(zhí)行過程為:首先將源串中的當(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ù)制。 在C語言中,用賦值運(yùn)算符、而不是賦值語句來實(shí)現(xiàn)賦 值操作,能給某些處理帶來很
17、大的靈活性,該語句(實(shí)現(xiàn)字 符串的復(fù)制)的用法就是最好的例證。,10.5 指向函數(shù)的指針,1.函數(shù)指針的概念一個(gè)函數(shù)在編譯時(shí),被分配了一個(gè)入口地址,這個(gè)地址就稱為該函數(shù)的指針。 可以用一個(gè)指針變量指向一個(gè)函數(shù),然后通過該指針變量調(diào)用此函數(shù)。,2.指向函數(shù)的指針變量 (1)定義格式 函數(shù)類型 (*指針變量)( ); 注意:“*指針變量”外的括號(hào)不能缺,否則成了返回指針值的函數(shù)。 例如,int (*fp)(); /* fp為指向int函數(shù)的指針變量*/,(2)賦值 函數(shù)名代表該函數(shù)的入口地址。因此,可用函數(shù)名給指向函數(shù)的指針變量賦值。 指向函數(shù)的指針變量 注意:函數(shù)名后不能帶括號(hào)和參數(shù);函數(shù)名前的
18、“ int min(int,int); int add(int,int); int process(int, int, int (*fun)(); int a,b; printf(enter a and b:); scanf(%d%d, ,max(int x, int y) return xy?x:y; min(int x, int y) return xy?y:x; add(int x, int y) return x+y; process(int x, int y, int (*fun)(int,int) /*fun是一個(gè)指向函數(shù)的指針,該函數(shù)是一個(gè)有兩個(gè)整型參數(shù)的返回整型值的函數(shù)*/ i
19、nt result; result=(*fun)(x,y); printf(%dn,result); ,作業(yè),10.4,10.5 要求相應(yīng)的寫出算法和程序,10.6 返回指針值的函數(shù),一個(gè)函數(shù)可以返回一個(gè)int型、float型、char型的數(shù)據(jù),也可以返回一個(gè)指針類型的數(shù)據(jù)。 返回指針值的函數(shù)(簡(jiǎn)稱指針函數(shù))的定義格式如下: 函數(shù)類型 *函數(shù)名(形參表列) 例如: int *a(int x,int y); 該函數(shù)的函數(shù)名為a,返回的是一個(gè)整型的指針。,例10.24有若干個(gè)學(xué)生的成績(jī)(每個(gè)學(xué)生有4門課程)要求在輸入學(xué)生序號(hào)后,能輸出該學(xué)生的全部成績(jī) #include void main() fl
20、oat score4=60,70,80,90,56,89,67,88,34,78,90,66; float *search(float (*point)4,int n); float *p; int i,m; printf(請(qǐng)輸入學(xué)生的序號(hào):); scanf(%d, ,float *search(float (*pointer)4,int n) float *pt; pt=*(pointer+n); return(pt); ,例10.25對(duì)上例中的學(xué)生,找出其中不及格課程的學(xué)生及其學(xué)生號(hào). #include void main() float score4=60,70,80,90,56,89,
21、67,88,34,78,90,66; float *search(float (*point)4); float *p; int i,j; for(i=0;i3;i+) p=search(score+i); if(p=*(score+i) printf(NO.%d score:,i); for(j=0;j4;j+) printf(%5.2ft,*(p+j); printf(n); ,float *search(float (*pointer)4) int i; float *pt; pt=*(pointer+1); for(i=0;i4;i+) if(*(*pointer+i)60) pt=*
22、pointer; return(pt); ,10.7 指針數(shù)組和指向指針的指針,10.7.1 指針數(shù)組的概念 數(shù)組的每個(gè)元素都是一個(gè)指針數(shù)據(jù)。指針數(shù)組比較適合用于指向多個(gè)字符串,使字符串處理更加方便、靈活。 定義格式 數(shù)據(jù)類型 *數(shù)組名元素個(gè)數(shù) 例如: int *p4; char *string10; 例10.26將若干字符串按字母的順序(由小到大)輸出 主函數(shù)中進(jìn)行初始化工作,然后調(diào)用排序函數(shù)和輸出函數(shù)進(jìn)行排序和輸出。,#include #include void main() void sort(char *name ,int n); void print(char *name,int n); int n=5; char *name=Follow me,BASIC,Great Wall, FORTRAN, Computer design; sort(name,5); print(name,5); ,void sort(char *name,int n) char *temp; int i,j,k; for(i=0;i0) k=j; if(k!=i) temp=namei;namei=namek;na
溫馨提示
- 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年證券從業(yè)資格證金融工具解析試題及答案
- 項(xiàng)目管理專業(yè)資格考試能力動(dòng)態(tài)試題及答案
- 注冊(cè)會(huì)計(jì)師考試的關(guān)鍵準(zhǔn)備細(xì)則試題及答案
- 注冊(cè)會(huì)計(jì)師考試2025年合規(guī)風(fēng)險(xiǎn)管理流程探討試題及答案
- 微生物與疾病預(yù)防的關(guān)系試題及答案
- 風(fēng)險(xiǎn)應(yīng)對(duì)策略在項(xiàng)目管理中的運(yùn)用試題及答案
- 證券從業(yè)資格證的復(fù)習(xí)心態(tài)調(diào)整技巧試題及答案
- 證券投資決策模型的應(yīng)用試題及答案
- 臨床微生物學(xué)課程總結(jié)試題及答案
- 股票價(jià)值評(píng)估的基本方法試題及答案
- 唐山高科總部大廈幕墻工程幕墻招標(biāo)技術(shù)評(píng)估總結(jié)
- 蘇教版三年級(jí)下冊(cè)數(shù)學(xué) 第三單元 解決問題的策略 測(cè)試卷
- 生產(chǎn)作業(yè)流程圖
- 10kV線路拆除
- 高中學(xué)生選課指導(dǎo)手冊(cè)
- 為老年人更換紙尿褲評(píng)分標(biāo)準(zhǔn)
- 教務(wù)管理系統(tǒng)UML模型PPT課件
- 吸收塔及煙囪施工方案
- 山東省醫(yī)院目錄
- 高中數(shù)學(xué)答題卡模板word版(共2頁)
- 小型構(gòu)件預(yù)制場(chǎng)建設(shè)方案
評(píng)論
0/150
提交評(píng)論