版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第十章 指 針,10.1 指針的概念,指針是C語言的重要特征,是C語言訪問內(nèi)存數(shù)據(jù)和程序的靈活 和有效的手段。,C語言的指針支持: 數(shù)組的地址引用; 函數(shù)的地址調(diào)用; 動態(tài)分配內(nèi)存。,內(nèi)存、地址、指針,內(nèi)存存放了計算機正在運行的程序和程序正在使用的數(shù)據(jù)。內(nèi) 存的基本單元是字節(jié)(Byte)。,為了訪問內(nèi)存單元,CPU給每個內(nèi)存單元一個編號,該編號稱 為該內(nèi)存單元的地址。,變量是程序中可以改變的量,當說 明變量時,系統(tǒng)將為其在內(nèi)存中開辟相 應的內(nèi)存單元。由此確定變量的地址及 內(nèi)存中的表示方式。,2000H,2001H,2002H,2003H,int a=0;,a 的 內(nèi) 存 單 元,a的地址,標識
2、符命名的指針變量名。,指針標志。,指針指向?qū)ο蟮念愋汀?int *p, *q; /* p、q是指向整型變量的指針。*/,float *pfValue ,*pf; /* pfValue和pf是指向浮點型的指針。*/,指針的引用,定義指針的目的是通過指針引用內(nèi)存對象,指針的引用應按如 下步驟進行:,說明指針,int a=0, *p;,指針指向?qū)ο?p=,通過指針引用對象,*p=*p+2;,指針操作的兩種運算:,取地址運算 ,2000H,a,p,p= /* p指向a。 */,2000H,*p=2;,2,舉例:,#include void main (void ) int x ,*p; x=55; p
3、= ,2000H,x,p,2000H,55,65,關(guān)于指針的說明:,指針必須指向?qū)ο蠛?,才能引用?int *p; *p=2; /* Error! */, p= 則: p1=,a,2000H,b,2400H,p1,p2,2000H,2400H,p1+; /*含義指向a后的整型單元*/,2002H,2002H,p1- -; /*指向a前的整型單元*/,p1+n; /*指向a后的n個整型單元*/,p1- n; /*指向a前的n個整型單元*/,p2- p1; /*a和b之間差的單元數(shù)*/,結(jié)果 200H,p n 相當于: p的實際內(nèi)容 nsizeof(*p);,六種關(guān)系運算,比較兩個同類型變量之間的
4、地址關(guān)系。,p1p2;,指針運算說明,#include void main(void) int a,b,*p1,*p2; a=2; b=3; p1= ,差別,a,指針指向數(shù)組,p=a; /*指向數(shù)組的首地址*/ p= /*指向數(shù)組的首地址*/,通過指針引用數(shù)組元素,當指針指向數(shù)組的首地址時,則下標為i的元素地址為: p+i 或a+i,引用數(shù)組元素可以有三種方法:,下標法: a i 指針法: *(p+i) 數(shù)組名法:*(a+i),注意:數(shù)組名是常量地址,不能改變!,a=p; /*Error!*/,舉例:打印數(shù)組中的奇數(shù)。,#include void main(void ) int i ,a 10
5、 ; for (i=0 ; i10 ; i+ ) scanf ( “ %d” , ,數(shù)組元素法。,循環(huán)輸入。,循環(huán)判斷,滿足條件輸出。,數(shù)組名法。,a+i,*(a+i),指針法。,*p ;,p = a;,p+,*(p+i),結(jié)果是否 正確?,p= a; *p=*,注意指針在運算時的變化。,指針與字符串(字符數(shù)組),字符串在內(nèi)存中可以存儲為兩種形式:,字符數(shù)組 字符串常量,可以使指針指向字符數(shù)組或字符串常量,通過指針引用字符數(shù) 組或字符串的各個字符。,指針與字符數(shù)組:,char *chp,ch =”Hello!”; /*說明字符指針和字符數(shù)組*/ chp=ch; /*指針指向字符數(shù)組*/ put
6、char( *(chp+2); /*通過指針引用數(shù)組元素*/,指針與字符串:,char *chp; /*說明字符指針*/ chp=“Hello!”; /*指針指向字符串*/ puts(chp); /*通過指針引用字符串*/,說明指針時,可以同時賦初值,如:,char *chp=“Hello!”;,賦值表示將字符串的地址賦給指針!,將無符號的八進制字符串轉(zhuǎn)換為十進制整數(shù)。,#include void main(void) char *p,s6; int i,n=0; p=s; gets(p); for(;*p!=0;p+) n=n*8+*p-0; printf(“%dn”,n); ,p指向s數(shù)組
7、。,輸入字符串。,s,p,s,5,5,6,0,n=0*8+5-05,n=5*8+5-045,n=45*8+6-0366,chp5ex5,思考題:將4位十六進值字符串轉(zhuǎn)化為十進制字符串。,二維數(shù)組的地址,如下說明數(shù)組 static int a34=1,2,3,4,5,6,7,8,9,10,11,12;,其二維結(jié)構(gòu)如下:,行,列,為了便于索引,C語言將數(shù)組分為兩級管理。,a0,a1,a2,將a理解為一維數(shù)組, 數(shù)組有三個元素,它們分別為a0、 a1,a2 。各個元素又是一個有四個元素的一維數(shù)組。,從地址的角度看: a 為a0 第一行的首地址 a+1 為a1 第二行的首地址 a+2 為a2 第三行的
8、首地址,a+1 地址一次加一行。,i行j列數(shù)組元素的地址可以由a i +j得到。,數(shù)組名地址的兩級管理,a,a0,a1,a2,a00 a01 a02,a10 a11 a12,a20 a21 a22,等價地址及其管理方式,數(shù)組名是數(shù)組的地址,而且是常量,* 運算不改變其值!,以下三種地址等價:,a+i,*(a+i),a i ,按行遞增,按列遞增,(a+1)+1,*(a+1)+1,差別?,數(shù)組名表示數(shù)組元素,a i j ,*(a+i) j ,*(*(a+i)+j),*(a i +j),指針與二維數(shù)組,int *p, a34; p=a; aij *(p+4*i+j)等價!,a00,a,a01,a02
9、,a0,a10,a11,a12,a1,a20,a21,a22,a2,a+1,a1+2,舉例: 在數(shù)組a中查找輸入的數(shù),輸出行列位置。,#include void main (void ) static int a34=1,2,3,4,5,6,7,8,9,10,11,12; int i, j,iS; int *p; p=a; scanf (“ %d” , ,下標法。,*(a i +j),*(*(a+i)+j),*(p+4*i+j),思考題:下列程序輸出的結(jié)果是?,#include #include void main(void) char arr24; strcpy(arr,”you”); st
10、rcpy(arr1,”me”); arr03= ,10.3 數(shù)組與函數(shù)參數(shù),問題:引用數(shù)組時只能引用數(shù)組元素。如果用參數(shù)傳遞數(shù)組元 素,則函數(shù)需要參數(shù)的量太多。為了解決此問題,可以通過指針傳 遞數(shù)組的地址。,數(shù)組作為函數(shù)參數(shù)定義有三種方式:,形參為指針; int ave( int *p) 形參為無下標數(shù)組; int ave(int a ) 形參為有下標數(shù)組。 int ave(int a10),舉例:通過函數(shù)求數(shù)組元素的平均值。,#include float mean( int * int) ; void main (void) int i , array10=1,2,3,4,5,6,7,8,9
11、10 ; float av ; av=mean(array,10) ; printf( “av=%f n %d ” ,av ,array 0 ) ; float mean( int *data ,int num ) int i ; float avg=0 ; for (i=0 ; inum ; i+) avg+= *data+; avg/=num ; *(data-10)=-1; return (avg ) ; ,指針法;,指針法。,形參為無下標數(shù)組;,無下標數(shù)組。,int data ,data0=-1;,data i ;,int data10,形參為有下標數(shù)組。,形參為有下標數(shù)組。,說明:,
12、三種方法的實質(zhì)都是傳遞地址, 可以混用。,形參的任何改變都影響實參。,函數(shù)中對數(shù)組的操作,下標不要 超過數(shù)組的下標范圍。,chp6ex2,10.4 返回指針的函數(shù),概念:函數(shù)可以返回一個值,也可以返回一個地址(指針), 如果函數(shù)返回指針,稱為返回指針的函數(shù)。,定義: type *函數(shù)名(形參表) ,int *max(int *a, int *b),舉例:在字符串中查找特定的字符。,#include #include char *lstrchar ( char * , char ) ; void main ( void) char c , *p , str80 ; gets (str ) ; s
13、canf ( “ %c ” , ,返回指針的函數(shù)。,chp6ex3,指向空!,10.5 指向函數(shù)的指針,概念:函數(shù)為程序模塊,函數(shù)對應內(nèi)存的地址,其首地址稱為 函數(shù)的入口地址,用函數(shù)名表示。C語言可以通過指針指向函數(shù)的 入口地址,從而實現(xiàn)函數(shù)的調(diào)用。,c=max(a,b);,int max(int x,int y) return (x=y?x:y); ,2400H,指向函數(shù)指針的定義:,type ( *p )( );,函數(shù)的類型。,指針,函數(shù),使用過程:,定義函數(shù)和指向函數(shù)的指針; 指針指向函數(shù); p=funname; 通過指針引用函數(shù)。格式: (* p)(實參表);,舉例:求a、b的最大值。
14、,#include int lmax(int,int); void main(void) int a,b,c; int (* funp)(); funp=lmax; scanf(“%d,%d”, ,說明指向函數(shù)的指針。,指針指向函數(shù)。,funp,lmax,通過指針引用函數(shù)。,lmax,舉例:通過參數(shù)傳遞,求a、b之和、之差。,#include int plus(int,int); int sub(int,int); int funa(int,int,int(*)(int,int); void main(void) int a,b,c; scanf(“%d,%d”, ,int plus(int
15、x,int y) return (x+y); int sub(int x,int y) return (x-y); ,10.6 指 針 數(shù) 組,指針是存放其它數(shù)據(jù)對象地址的變量。因此,指針可以構(gòu)成數(shù) 組。每個數(shù)組元素為一個指針變量,且在內(nèi)存中連續(xù)存放。,指針數(shù)組的說明,說明格式: type *數(shù)組名const exp;,int *p 4 ;,含義是在內(nèi)存中開辟空間,并指明元素所指向的對象的類型。,數(shù)組名p為數(shù)組的地址。,使用前必須讓各元素指向?qū)ο蟆?int i, a34, *p3; for(i=0;i3;i+) p i =a i ; *(pi+j)=2; /*通過指針數(shù)組引用數(shù)組元素aij*/
16、,指針數(shù)組的應用舉例,指針數(shù)組與多維數(shù)組,通過指針數(shù)組按數(shù)學方式輸出數(shù)組的值。,#include void main ( ) int i , j; static int a34= 1,2,3,4, 5,6,7,8, 9,10,11,12 ; int *p3= a0, a1, a2 ; for (i=0 ; i3 ; i+) for (j=0; j4; j+) printf (“ %5d” , *(pi+j); printf ( “n” ) ; ,p0,數(shù)組a的二維結(jié)構(gòu),p1,p2,a0,a1,a2,每輸出一行,打印回車。,指針數(shù)組與多字符串,通過指針數(shù)組構(gòu)成的菜單,執(zhí)行DOS命令。,#incl
17、ude void main(void ) char *command = “dir”, “time”, “date”, ch ; for ( ; ; ) do printf (“1: directoryn”) ; printf (“2:set timen” ) ; printf (“3:set daten”) ; printf (“4:quitn”) ; printf (nselection:”) ; ch =getchar( ) ; printf (“n”) ; while (ch4) ; if (ch=4) break; system (commandch-1) ; ,內(nèi)層循環(huán)輸入選項,外
18、層循環(huán)根據(jù)選項執(zhí)行命令,執(zhí)行系統(tǒng)命令函數(shù),如:system(“dir”);,3-1 2,chp5ex3,10.7 指向指針的指針,如果指針變量的內(nèi)容存放其它指針的地址,稱該指針為指向指 針的指針。,指向指針的指針的說明:,形式: type *p;,int *p;,p是一個指向整形指針的指針。,#include void main ( void) int x, *p, *q ; x=10; p= ,p為指向整型的指針。,q為指向整型指針的指針。,x,p,q,2000H,3000H,10,2000H,3000H,指向指針的指針的應用,指向指針的指針一般用于多維數(shù)組和指針數(shù)組的操作。,多維數(shù)組,#include void main ( ) int a34=1,2,3,4,5,6,7,8,9,10,11,12, ; int *ar
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年水產(chǎn)養(yǎng)殖病害防控策略指南
- 2026青海西寧市城北區(qū)大堡子鎮(zhèn)中心衛(wèi)生院招聘衛(wèi)生專業(yè)技術(shù)人員的1人備考題庫含答案詳解
- 2026浙江寧波市鎮(zhèn)海中學國際部誠招學科雙語教師備考題庫及完整答案詳解1套
- 2026年林下經(jīng)濟模式創(chuàng)新發(fā)展課
- 軟件開發(fā)大數(shù)據(jù)模塊開發(fā)規(guī)范手冊
- 2026福建三明市永安市羅坊鄉(xiāng)人民政府招聘編外聘用駕駛員1人備考題庫及完整答案詳解1套
- 2026年企業(yè)并購法律盡調(diào)實務培訓
- 職業(yè)健康促進與企業(yè)健康管理未來趨勢
- 駐馬店2025年河南駐馬店市平輿縣人民醫(yī)院招聘人事代理人員28人筆試歷年參考題庫附帶答案詳解
- 金華2025年浙江金華義烏市人民檢察院司法雇員招錄6人筆試歷年參考題庫附帶答案詳解
- 江蘇省鹽城市大豐區(qū)四校聯(lián)考2025-2026學年七年級上學期12月月考歷史試卷(含答案)
- 文化IP授權(quán)使用框架協(xié)議
- 2024年廣西壯族自治區(qū)公開遴選公務員筆試試題及答案解析(綜合類)
- 湖北煙草專賣局招聘考試真題2025
- 人教部編五年級語文下冊古詩三首《四時田園雜興(其三十一)》示范公開課教學課件
- AI領(lǐng)域求職者必看美的工廠AI面試實戰(zhàn)經(jīng)驗分享
- 4.2《揚州慢》課件2025-2026學年統(tǒng)編版高中語文選擇性必修下冊
- 捻線工三級安全教育(公司級)考核試卷及答案
- 學校智慧校園建設(shè)協(xié)議
- 上海市中考物理基礎(chǔ)選擇百題練習
- 預制板粘貼碳纖維加固計算表格
評論
0/150
提交評論