c程序設(shè)計(譚浩強(qiáng)版)第九講指針1_第1頁
c程序設(shè)計(譚浩強(qiáng)版)第九講指針1_第2頁
c程序設(shè)計(譚浩強(qiáng)版)第九講指針1_第3頁
c程序設(shè)計(譚浩強(qiáng)版)第九講指針1_第4頁
c程序設(shè)計(譚浩強(qiáng)版)第九講指針1_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、2022-4-242022-4-242022-4-242022-4-242022-4-24變量的兩個物理意義變量的兩個物理意義 變量的內(nèi)容變量的內(nèi)容變量的地址變量的地址535.0變量的內(nèi)容變量的內(nèi)容變量的內(nèi)容變量的內(nèi)容變量的地址變量的地址變量的地址變量的地址2022-4-242022-4-242022-4-242022-4-24510013882022-4-242022-4-24指針變量前面的“*”,表示該變量的類型為指針型變量。例: float *p1;指針變量名是p1 ,而不是* p1 。2022-4-24510013882022-4-242000NULL指針變量定義的形式指針變量定義的形

2、式指針變量初始化指針變量初始化201220202022-4-24int *p = NULL;int a = 0;int *p =&a;int a = 0;int *p = &a;int *p1 =p;2022-4-24int a = 0;int *p = &a;int *p1 =p;app12022-4-242022-4-242022-4-242022-4-24pipa0a9pa52022-4-24pa0a9pi2022-4-24int *p,i;p = &i; p 指針變量*p 指針p的目標(biāo)變量&p: 指針變量p占用存儲區(qū)域地址pi2022-4-24i

3、nt a,b;p = &a;2022-4-2420042000*p = &a;52022-4-242022-4-242022-4-24c=&a;p=b;p=&a;b=2000;指針變量只指針變量只存放地址存放地址!一個指針變量不能一個指針變量不能指向與其類型不同指向與其類型不同的變量的變量!應(yīng)在類型相應(yīng)在類型相同的指針變同的指針變量之間賦值量之間賦值這是正確的!這是正確的!設(shè):設(shè):int *c, a=20, *b=&a; float *p;c=*b;不能給指針賦非地不能給指針賦非地址值!址值!2022-4-24方法方法1 1:目標(biāo)變量值不變,改變指針變量

4、的:目標(biāo)變量值不變,改變指針變量的指向求解。指向求解。voidvoid main(main(intint a,ba,b, ,* *p1p1, ,* *p2p2, ,* *p p; ; p1p1= =& &a;a;p2p2= =& &b; b; scanfscanf( (“%d%d%d%d”, ,p1p1, ,p2p2);); if( if(* *p1p1 * *p2p2) ) p=p1; p1=p2; p2=pp=p1; p1=p2; p2=p; printfprintf( (“a=%a=%d,bd,b=%d=%dn n”,a,b,a,b);); printfp

5、rintf( (“max=%max=%d,mind,min=%dn=%dn”, ,* *p1p1, ,* *p2p2););【例【例9.1】輸入】輸入a、b兩個整數(shù),兩個整數(shù),使用指針變量按大小順序輸出使用指針變量按大小順序輸出這兩個整數(shù)。這兩個整數(shù)。 a ab bp1p1p2p2p p6 68 86 86 8a=6,b=8a=6,b=8max=8,min=6max=8,min=62022-4-24方法方法2 2:利用指針變量直接改變目標(biāo)變量的值。:利用指針變量直接改變目標(biāo)變量的值。voidvoid main(main( ) ) int a,b,t, int a,b,t,* *p1p1, ,*

6、 *p2p2; ; p1p1= =& &a;a;p2p2= =& &b; b; scanf( scanf(%d%d%d%d, ,p1p1, ,p2p2);); if( if(* *p1p1 * *p2p2) ) t= t=* *p1p1; ; * *p1p1= =* *p2p2; ; * *p2p2=t;=t; printf( printf(a=%d,b=%dna=%d,b=%dn,a,b); ,a,b); printf(printf(max=%d,min=%dnmax=%d,min=%dn, ,* *p1p1, ,* *p2p2);); a a、* *p1p1

7、b b、* *p2p2p1p1p2p2t t6 68 86 86 8a=8,b=6a=8,b=6max=8,min=6max=8,min=66 68 86 62022-4-24a=1245016p1=1245036, *p1=61p2=1245020, *p2=21p1-p2=4*(p1+2)=81,(*p1+2)=63 兩個指針變量不能做加法運(yùn)算。兩個指針變量不能做加法運(yùn)算。 只有當(dāng)指針變量指向數(shù)組時,并且只有當(dāng)只有當(dāng)指針變量指向數(shù)組時,并且只有當(dāng)運(yùn)算結(jié)果仍指向同一數(shù)組中的元素時,指針運(yùn)算結(jié)果仍指向同一數(shù)組中的元素時,指針的加減運(yùn)算才有意義。的加減運(yùn)算才有意義。 指針加減運(yùn)算的結(jié)果不以字節(jié)為

8、單位,而指針加減運(yùn)算的結(jié)果不以字節(jié)為單位,而是以數(shù)據(jù)類型的大?。词且詳?shù)據(jù)類型的大小(即sizeof(類型類型))為單)為單位。位。 只有當(dāng)兩個指針變量指向同一數(shù)組時,進(jìn)只有當(dāng)兩個指針變量指向同一數(shù)組時,進(jìn)行指針相減才有實際意義。行指針相減才有實際意義。 *(p1+n)與與(*p1)+n是兩個不同的概念是兩個不同的概念。3020104050607080901003121114151617181911012022-4-24301050 指向同一數(shù)組的兩個指針可以進(jìn)行關(guān)系指向同一數(shù)組的兩個指針可以進(jìn)行關(guān)系運(yùn)算運(yùn)算 指針與一個整型數(shù)據(jù)比較是沒有意義的,指針與一個整型數(shù)據(jù)比較是沒有意義的,不同類型指針

9、變量之間的比較是非法的。不同類型指針變量之間的比較是非法的。 NULL NULL可以與任何類型指針進(jìn)行可以與任何類型指針進(jìn)行=、!=!=的的運(yùn)算,用于判斷指針是否為空指針。運(yùn)算,用于判斷指針是否為空指針。2022-4-24t2022-4-24傳值調(diào)用值傳遞實參單向傳遞到形參僅在函數(shù)內(nèi)調(diào)換參數(shù)的值ab34xy34方法方法 12022-4-24ab34tempxy&a&b傳址調(diào)用改變的是地址指向的目標(biāo)變量的值,函數(shù)內(nèi)外均改變方法方法 22022-4-24void swap(int *p1,int *p2)int *p; printf(調(diào)用中交換前:調(diào)用中交換前:*p1=%d,*p2

10、=%dn,*p1,*p2); p=p1; p1=p2; p2=p; printf(調(diào)用中交換后:調(diào)用中交換后:*p1=%d,*p2=%dn,*p1,*p2);void main() int x1,x2; scanf(“%d%d”,&x1,&x2); printf(“1: x1=%d,x2=%dn”,x1,x2); swap(&x1,&x2); printf(“2: x1=%d,x2=%dn”,x1,x2);方法方法 320 101: x1=20,x2=10調(diào)用中交換前:*p1=20,*p2=10調(diào)用中交換后:*p1=10,*p2=202: x1=20,x2=10

11、2022-4-24主調(diào)函數(shù)主調(diào)函數(shù)被調(diào)函數(shù)被調(diào)函數(shù)main() int x1,x2; scanf(“%d%d”,&x1,&x2); printf(“1:x1=%d,x2=%dn”, x1,x2); swap(&x1,&x2); printf(“2:x1=%d,x2=%dn”, x1,x2);void swap(int *p1,int *p2)int *p; printf(“調(diào)用中交換前調(diào)用中交換前: *p1=%d,*p2=%dn”,*p1,*p2); p=p1; p1=p2; p2=p; printf(調(diào)用中交換后:調(diào)用中交換后:*p1=%d,*p2=%dn,*

12、p1,*p2);&x1&x1實實 參參形形 參參&x2&x2p1p2p1p220 x1x210&x1p2022-4-24傳址調(diào)用,形參為指針變量或數(shù)組名(指針常量)改變的是地址指向的目標(biāo)變量的值,函數(shù)內(nèi)外均改變傳值調(diào)用,形參為普通變量改變的是形參的值,實參不發(fā)生改變。2022-4-242022-4-24傳址調(diào)用改變的是地址指向的目標(biāo)變量的值,函數(shù)內(nèi)外均改變2022-4-242022-4-24a0a0a4a42022-4-24a0a0a9a92022-4-24運(yùn)行結(jié)果 :b0=0 b1=1 b2=2 b3=3 b4=4 2022-4-24數(shù)組bb0b1b2

13、b3b4p循環(huán)前p循環(huán)結(jié)束數(shù)組bb0b1b2b3b4pp-2p-1p1p22022-4-242022-4-24【例【例9.5】從鍵盤輸入從鍵盤輸入5 5個整數(shù),個整數(shù),找出其中的最大數(shù)(用函數(shù)實找出其中的最大數(shù)(用函數(shù)實現(xiàn)),并輸出?,F(xiàn)),并輸出。p a0 a1 aN-1主調(diào)函數(shù)被調(diào)函數(shù)2022-4-242022-4-24運(yùn)行情況:12 45 56 23 89 75 64 62 31 10Max:892022-4-24【例【例9.6】求已知數(shù)組中的最小求已知數(shù)組中的最小值元素,并將它和該數(shù)組最前值元素,并將它和該數(shù)組最前面的元素交換。面的元素交換。2022-4-242022-4-24運(yùn)行情況如

14、下: 55 5 12 4 1 45 8 89 62 54 1 5 12 4 55 45 8 89 62 542022-4-24提示:用指針做傳址調(diào)用,可返回多個返回值,也可以返回一個2022-4-24【例【例9.7】寫一個函數(shù),將一維】寫一個函數(shù),將一維數(shù)組中的元素變?yōu)槠淦椒綌?shù)組中的元素變?yōu)槠淦椒健?022-4-242022-4-242022-4-240 0101020201 1111121212 2121222223 313132323aa a00a a11a a22aa+1a+22022-4-242022-4-242022-4-242022-4-240 0101020201 1111121

15、212 2121222223 313132323a0數(shù)組數(shù)組a1數(shù)組數(shù)組a2數(shù)組數(shù)組 ()j2022-4-240 0101020201 1111121212 2121222223 313132323a2022-4-24#include void main( ) int a34=1,2,3,4,11,12,13,14,21,22,23,24; int *p,i,j; p=a0; for (i=0;i3;i+) for(j=0;j4;j+) /*指針表示法輸出元素指針表示法輸出元素aij */ printf(%4d,*(*(a+i)+j); printf(n); printf(n); for (i

16、=0;i3;i+) for(j=0;j4;j+) /* 行數(shù)組表示法輸出元素行數(shù)組表示法輸出元素 aij */ printf(%4d,*(ai+j); printf(n); 例例9.8輸出二維數(shù)組元素。輸出二維數(shù)組元素。2022-4-24運(yùn)行情況如下:1 2 3 411 12 13 1421 22 23 24 12 3 412 12 13 1421 22 23 2412 3 413 12 13 1421 22 23 24 12 3 414 12 13 1421 22 23 242022-4-24字符串的兩種表示方式:字符串的兩種表示方式: 表示方式,字符串存放在一維數(shù)表示方式,字符串存放在一維

17、數(shù)組中,引用時用數(shù)組名。組中,引用時用數(shù)組名。 表示方式,字符指針變量存表示方式,字符指針變量存放字符串的首地址,引用時用指針變量名。放字符串的首地址,引用時用指針變量名。2022-4-242022-4-24運(yùn)行情況如下:運(yùn)行情況如下:Please input character stringlanguage(odqjxdjh【例【例9.9】簡單的字符串加密就是】簡單的字符串加密就是將原字符所對應(yīng)的將原字符所對應(yīng)的ASCII碼值加或碼值加或減一個整數(shù),形成一個新的字符。減一個整數(shù),形成一個新的字符。#include void main( ) char *cp,ps20; printf(Plea

18、se input a string:); scanf(%s,ps); /* 輸入字符串輸入字符串 */ cp=ps; /* 循環(huán)前讓循環(huán)前讓cp指向字符串指向字符串 */ while( *cp!=0) /* 當(dāng)當(dāng)cp未移向串尾且未找到時繼續(xù)循環(huán)查找未移向串尾且未找到時繼續(xù)循環(huán)查找 */ if (*cp=u) printf(The character %c is %d-thn,u, cp-ps+1); /* 位置從位置從1算起算起 */ break;cp+; /* 順序移動指針順序移動指針cp */ 2022-4-24Please input a string:LanguageThe character u is 5-th#include void strcopy( char *s1, char *s2) ;void main( ) char *str1=C program, str220; strcopy(str1,str2); /* 分別以字符指針和字符數(shù)組名為實參分別以字符指針和字符數(shù)組名為實參 */ printf(The first stringis

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論