版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第十章,指 針,§1,指針的概念,一、存儲器的內(nèi)部結(jié)構(gòu),,,,,,,,2000,2002,2004,2006,,,,,3,6,9,,main(){int i,j,k; scanf(" %d" ,&i); j=6; k=i+j; printf(" %d" ,k);},,,,,,,,2000,2002,2004,2006,,,,,3,6,9,直接訪問,,i,j,k,程序
2、經(jīng)編譯后,變量名就不復(fù)存在,以地址對應(yīng)。,,1.直接訪問 對變量值的存取總是按地址進(jìn)行。2.間接訪問 利用指針變量,,指針變量,間接訪問,int *p;p=&j;*p=6;,若p 是存放變量j的地址的指針變量則 *p是指針變量 p所指的對象(即變量 j ),2000,6,,j,,2000,p,指針運算符,取地址運算符,,二、指針變量的定義,,1.定義 指針變量:用來存放變量地址的變量
3、 如:p所對應(yīng)的地址是3010,對應(yīng)的內(nèi)容是2000, 2000就是 i 所對應(yīng)的地址,因此,p是存放變量 i 的地址的變量。 變量的指針:就是變量的地址 如 i 所對應(yīng)的內(nèi)存地址是2000,則 i 的指針就是2000,,i,p,,2.指針變量有兩種運算符:&:取地址運算符, 如:p=&i;* :指針運算符。 如:* p, 它與i 等價,3.指針變量的定義形式,類型
4、標(biāo)識符 *指針名其中:類型標(biāo)識符:指出指向何種數(shù)據(jù)類型的變量指針名:表示指針變量名.例: int *p1,*p2; float *pf;,,三、指針的初始化,,指針初始化的一般形式:類型標(biāo)識符 *指針名=初始化地址,,例: int i,j; int *p1=&i; int *p2=&j;,&i,&j,,,p1,p2,j,i,,,說明:(1)一
5、個指針變量只能指向同一類型的變量。 如: int i,*p1; float a; p1=&i; 合法 p1=&a; 不合法。 (2)也可采用賦值號將一個指針的值傳遞給另一個指針例:int i,j; int *p1, *p2; p1=&
6、amp;i; p2=p1;(3)將指針初始化為空指針 例:int *p=NULL;,五、指針的運算,1.賦值運算2.算術(shù)運算,,main( ){int a, *p1, *p2 ;a=123; p1=&a; p2=p1;printf(" %d, %d,%d\ n ",a, *p1,*p2);printf(" %p, %p,%p\ n ",&a, p
7、1,p2);printf(" %p, %p,%p\ n ",&a, &p1,&p2);},fff4,fff4,123,p1,p2,a,,,fff0,fff2,fff4,結(jié)果:123, 123,123Fff4,fff4,fff4Fff4,fff2,fff0,1.賦值運算,,2.算術(shù)運算,int *p1,x,y;p1=&x;p1++;p1--;p1=p1+9;,,,,,,
8、,2000,2002,2004,2006,,,,,p1,,§2,指向變量的指針變量,例1 輸入a, b兩個整數(shù),通過比較以后,用指針方法按先大后小的順序輸出.方法1:main( ){int *p1, *p2, *p, a, b; scanf(" %d,%d ",&a,&b);p1=&a; p2=&b;if(a<b) {p=p1; p1=p2;
9、 p2=p; }printf(" a=%d, b=%d\ n ", a, b);printf(" max=%d, min=%d\ n ", * p1, *p2);輸入: 5, 9?輸出: a=5,b=9max=9, min=5,交換前 交換后ffd2 ffd8 ffda p1ffd4 ffda ffd8
10、 p2ffd6 20 ffd8 pffd8 5 5 affda 9 9 b,,,,,,,,,,,,,,,只交換了指針的值,沒有交換變量的值,,,,,,,,,方法2:swap(int *p1, int *p2){int p; p=*p1; *p1=*p2; *p2=
11、p;}main( ){int a, b, *p11, *p12;scanf(" %d, %d ", &a, &b); p11=&a; p12=&b;if(a<b) swap(p11,p12); printf(" max=%d,min=%d\ n ",a,b);}運行:輸入:5,9?輸出: max=9,min=5,ffca 5
12、 p ┆ ffd0 ffd4 p1 ffd2 ffd6 p2 ffd4 5 9 a ffd6 9 5 b ffd8 ffd4 p11 ffda ffd6 p12,,,,,,,,,,,,,,,,,,,,
13、,,,,,方法3:swap(int *p1, int *p2){int *p; p=p1; p1=p2; p2=p;}main( ){int a, b, *p11, *p12;scanf(" %d, %d ", &a, &b); p11=&a; p12=&b;if(a<b) swap(p11,p12); printf(" max=%d,mi
14、n=%d\ n ",a,b);}該方法是錯誤的。原因:單向的值傳遞,當(dāng)函數(shù)調(diào)用返回后,分配的單元被釋放了.,例2 輸入 a, b, c三個整數(shù),按從大到小順序輸出swap(int *pt1, int *pt2){int p; p=*pt1; *pt1=*pt2; *pt2=p;}exchange(int *q1, int *q2, int *q3){if(*q1 < *q2) swap
15、(q1, q2); if(*q1 < *q3) swap(q1, q3); if(*q2 < *q3) swap(q2, q3);}main( ){int a,b,c,*p1,*p2,*p3;scanf(" %d,%d,%d ",&a,&b,&c);p1=&a; p2=&b; p3=&c;exchange(p1, p2, p3);p
16、rintf(" a=%d, b=%d, c=%d\ n ",a, b, c); }輸入:9,0,10輸出: a=10,b=9,c=0,ffc0 9 0 pffc2 ffcc ffce pt1ffc4 ffdo ffd0 pt2ffc6 ffcc
17、 q1ffc8 ffce q2ffca ffd0 q3ffcc 9 10 10 affce 0 0 9 bffd0 10 9
18、 0 cffd2 ffcc p1ffd4 ffce p2ffd6 ffd0 p3,,,,,,,,,,,,,,,,,,,§3,指向數(shù)組的指針變量,,一、 指向數(shù)組元素的指針變量,,定義一個指向數(shù)組元素的指針變量:1.變量的聲明
19、2.變量的初始化,,例:int a[5]; int *p; p=a; p=&a[0];,ffca 2 a[0]ffcc a[1]ffce a[2]ffd0 a[3]ffd2 a[4]
20、ffd4 ffca p,ffca 2 a[0]ffcc a[1]ffce a[2]ffd0 a[3]ffd2 a[4]ffd4 ffca p,,,,,,,,,,,,,,二、 通過指針引用數(shù)
21、組元素1.只使用指針2.使用指針和下標(biāo)3. 使用帶下標(biāo)的指針變量,,1.只使用指針例題: 要求輸出數(shù)組a的5個元素的值main( ){int i, a[5];for(i=0;i<5;i++)scanf(" %d ",&a[i]);for(i=0;i<5;i++)printf(" %d ",a[i]);},,main( ){int *p,i, a[
22、5];p=a;for(i=0;i<5;i++)scanf(" %d ",p++);p=a;for(i=0;i<5;i++)printf(" %d ",* p++);},ffca 2 a[0]ffcc a[1]ffce a[2]ffd0
23、 a[3]ffd2 a[4]ffd4 ffca p,,,,,,,,,,,,,,例如:p++*++p* p--*-- p p++,,*(++p),,*(p--),,*(--p),,2.使用指針和下標(biāo)main( ){int *p,i, a[5];p=a;for(i=0;i<5;i++)scanf(" %d ",
24、p++);p=a;printf(" %d ", a[2]);printf(" %d ",* (p+2));},ffca 2 a[0]ffcc a[1]ffce a[2]ffd0 a[3]ffd2 a[
25、4]ffd4 ffca p,,,,,,,,,,,,,,3. 使用帶下標(biāo)的指針變量main( ){int *p,i, a[5];p=a;for(i=0;i<5;i++)scanf(" %d ",p++);p=a;for(i=0;i<5;i++)printf(" %d ", p[2]);},ffca 2 a
26、[0]ffcc a[1]ffce a[2]ffd0 a[3]ffd2 a[4]ffd4 ffca p,,,,,,,,,,,,,,三、數(shù)組名作函數(shù)參數(shù),例: 將數(shù)組a中n個整數(shù)按相反順序存放算法: a[0] ? a[n-1]
27、 a[1] ? a[n-2] ┆ a[(n-1)/2] ? a[ n-1- (n-1)/2 )],x[0] x[1] x[2]x[3] x[4]x[5] x[6] x[7] x[8]x[9]a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9],3 7 9 11 0 6
28、 7 5 4 22 4 5 7 6 0 11 9 7 3,,,,,,,,,,,,,,m,,,,,,,,,,,,,i,j,,例: 將數(shù)組a中n個整數(shù)按相反順序存放算法: a[0] ? a[n-1] a[1] ? a[n-2] ┆ a[(
29、n-1)/2] ? a[ n-1- (n-1)/2 )]方法1 實參,形參均為數(shù)組名void inv (x,n)int x[ ], n;{int t, i, j, m=(n-1)/2;for(i=0;i<=m;i++){j=n-1-i;t=x[i]; x[i]=x[j]; x[j]=t; }return; }main( ){static int i,a[10]={3,7,9,11,0,6,7,5,
30、4,2}; inv(a, 10); for(i=0;i<10;i++) printf(“%d,”,a[i]); },x[0] x[1] x[2]x[3] x[4]x[5] x[6] x[7] x[8]x[9]a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9],3 7 9 11 0 6 7 5 4
31、 22 4 5 7 6 0 11 9 7 3,,,,,,,,,,,,,,m,,,,,,,,,,,,,i,j,i j0 9 t?x[0]=3, x[0] ?x[9]=2, x[9] ?t=31 8 t?x[1]=7, x[1] ?x[8]=4, x[8] ?t=72 7 t?x[2]=
32、9, x[2] ?x[7]=5, x[7] ?t=93 6 t?x[3]=11, x[3] ?x[6]=7, x[6] ?t=114 5 t?x[4]=0, x[4] ?x[5]=6, x[6] ?t=0,,,,,,,,方法2 實參為數(shù)組名,形參為指針變量void inv(x,n)int *x, n;{int *p, t, *i, *j, m=(n-1)/2;i=x; j
33、=x+n-1; p=x+m;for( ; i<=p; i++, j--){t=*i; *i=*j; *j=t; }return; }main( ){static int i, a[10]={3, 7, 9, 11, 0, 6, 7, 5, 4, 2}; inv(a, 10);for(i=0; i<10; i++)printf(“%d,” , a[i]); },i, x ? 3
34、 2 a[0] 7 4 a[1] 9 5 a[2] 11 7 a[3]p=x+m ? 0 6 a[4] 6 0 a[5] 7 11 a[6]
35、 5 9 a[7] 4 7 a[8]j ? 2 3 a[9]t ?3, * i ?2, * j ?3t ?7, * i ?4, * j ?7t ?9, * i ?5, * j ?9t ?11, * i ?7, * j ?11t ?0, * i ?6, * j ?0,,,,,,,,,,,,
36、,,,,,,,,,,,方法3 實參,形參均為指針變量名void inv(x,n)int *x, n;{int *p, t, *i, *j, m=(n-1)/2;i=x; j=x+n-1; p=x+m;for( ; i<=p; i++, j--){t=*i; *i=*j; *j=t; }return; }main( ){static int i, a[10],*p=a; for(i=0; i<1
37、0; i++) scanf(“%d,”,p++);p=a;inv(p, 10);p=a;for(i=0; i<10; i++)printf(“%d,” ,*p++);},i, x ? 3 2 a[0] 7 4 a[1] 9 5 a[2] 11
38、7 a[3]p=x+m ? 0 6 a[4] 6 0 a[5] 7 11 a[6] 5 9 a[7] 4 7 a[8]j ? 2 3 a[9]t ?3, * i ?2,
39、* j ?3t ?7, * i ?4, * j ?7t ?9, * i ?5, * j ?9t ?11, * i ?7, * j ?11t ?0, * i ?6, * j ?0,,,,,,,,,,,,,,,,,,,,,,,,方法4 實參為指針變量,形參為數(shù)組.void inv(x,n)int x[], n;{int p, t, i, j, m=(n-1)/2;for(i=0 ; i<=m;
40、 i++){j=n-1-i; t=x[i];x[i]=x[j];x[j]=t; }return; }main( ){static int i, a[10],*p=a;for(i=0; i<10; i++) scanf(“%d,”,p++);printf(“\n”);p=a;inv(p, 10);p=a;for(i=0; i<10; i++)printf(“%d” ,*p++);},i, x
41、 ? 3 2 a[0] 7 4 a[1] 9 5 a[2] 11 7 a[3]p=x+m ? 0 6 a[4] 6 0 a[5] 7 11 a[6
42、] 5 9 a[7] 4 7 a[8]j ? 2 3 a[9]t ?3, * i ?2, * j ?3t ?7, * i ?4, * j ?7t ?9, * i ?5, * j ?9t ?11, * i ?7, * j ?11t ?0, * i ?6, * j ?
43、0,,,,,,,,,,,,,,,,,,,,,,,歸納: 在被調(diào)用函數(shù)中改變數(shù)組的值,實參、形參的取值,有四種情況:(1)實、形參都是數(shù)組名 main( ) f(x, n) {int a[10] int x[ ], n; ┆
44、 { f(a, 10); ┆ ┆ } }(2)實參為數(shù)組名,形參為指針變量 main( ) f(x, n) {int a[10]
45、 int *x, n; ┆ { f(a, 10); ┆ ┆ } },a[0] x[0]
46、 a[1] x[1] ┆ ┆ a[9] x[9],x? a[0] a[1] ┆ ┆ a[9],,,,,,,,,,,,,,,(3)形、實參都是指針變量 main(
47、) f(x, n) {int a[10] ,*p; int *x, n; ┆ { p=a; f(p, 10); ┆
48、 ┆ } }(4)實參為指針變量,形參為數(shù)組 main( ) f(x, n) {int a[10] ,*p; int x[ ], n; ┆
49、 { p=a; f(p , 10); ┆ ┆ } },x、 p ? a[0]
50、 a[1] ┆ a[9],p? a[0] x[0] a[1] x[1] ┆ a[9] x[9],,,,,,,,,,,,,,,例2 用選擇法對10個整
51、數(shù)按從大到小順序排列main( ){int *p, i, a[10]; p=a;for(i=0; i x[k]) k=j; if(k != i) {t=x[i];x[i]=x[k];x[k]=t;}} }輸入:1 3 -2 6 8 -1 9 2 4 5,p?? 1 a[0],x[0] 3 a[1],x[1] -2 a[2],x[2] 6
52、 a[3],x[3] 8 a[4],x[4] -1 a[5],x[5] 9 a[6],x[6] 2 a[7],x[7] 4 a[8],x[8] 5 a[9],x[9],,,x[0]x[1]x[2]x[3]x[4]x[5]x[6]x[7]x[8]x[9]a[0]a[1] a[2]a[3]a[4]a[5]a[6
53、] a[7]a[8]a[9] 1 3 -2 6 8 -1 9 2 4 5 9 1 8 3 6 -2 5
54、 -2 4 3 3 -1 2 1,,,,,,,,,,,,,,,,,i j0 1 k=0 x[1]>x[0]
55、 k=1 2 x[2]>x[1] 3 x[3]>x[1] k=3 4 x[4]>x[3] k=4 5 x[5]>x[4] 6 x[6]>x[4] k=6 7 x[7]>x[6]
56、 8 x[8]>x[6] 9 x[9]>x[6] t?x[0]=1, x[0]?x[6]=9 x[6] ?t=11 2 k=1 x[2]>x[1] 3 x[3]>x[1] k=3 4 x[4]>x[3] k=4
57、 5 x[5]>x[4] 6 x[6]>x[4] 7 x[7]>x[4] 8 x[8]>x[4] 9 x[9]>x[4] t?x[1]=3, x[1]?x[4]=8 x[4] ?t=3,2
58、3 k=2 x[3]>x[2] k=3 4 x[4]>x[3] 5 x[5]>x[3] 6 x[6]>x[3] 7 x[7]>x[3] 8 x[8]>x[3] 9 x[9]&
59、gt;x[3] t?x[2]=-2, x[2]?x[3]=6 x[3] ?t=-23 4 k=3 x[4]>x[3] k=4 5 x[5]>x[4] 6 x[6]>x[4] 7 x[7]>x[4] 8 x[8]>x[4]
60、 k=8 9 x[9]>x[8] k=9 t ?x[3]=-2, x[3]?x[9]=5 x[9] ?t=-24 5 k=4 x[5]>x[4] 6 x[6]>x[4] 7 x[7]>x[4] 8 x[8]>x[
61、4] k=8 9 x[9]>x[8],t ?x[4]=3, x[4]?x[8]=4 x[8] ?t=35 6 k=5 x[6]>x[5] k=6 7 x[7]>x[6] k=7 8 x[8]>x[7] k=8 9 x[9]
62、>x[8] t ?x[5]=-1, x[5]?x[8]=3 x[8] ?t=-16 7 k=6 x[7]>x[6] k=7 8 x[8]>x[7] 9 x[9]>x[7] t ?x[6]=1, x[6]?x[7]=2 x[7] ?t=1 7 8
63、k=7 x[8]>x[7] x[9]>x[7],,四、指向多維數(shù)組的指針和指針變量,關(guān)鍵是多維數(shù)組地址的轉(zhuǎn)化問題,,1、多維數(shù)組的地址如定義,,a??2000 a[0 ][ 0] 2002 a[0 ][ 1] 2004 a[0 ][ 2] 2006 a[0 ][ 3]a+1 2008 a[1 ][ 0]
64、 2010 a[1 ][ 1] 2012 a[1 ][ 2] 2014 a[1 ][ 3]a+2 2016 a[2 ][ 0] 2018 a[2 ][ 1] 2020 a[2 ][ 2] 2022 a[2 ][ 3],(1),(2),a[0] a[0 ][ 0] a[0 ][ 1] a[0 ][ 2] a[0 ][ 3
65、] a[1] a[1 ][ 0] a[1 ][ 1] a[1 ][ 2] a[1 ][ 3] a[2] a[2 ][ 0] a[2 ][ 1] a[2 ][ 2] a[2 ][ 3],,說明:(1)a是二維數(shù)組的首地址。 a[0], a[1] ,a[2]是各一維數(shù)組的首地址。 a,a+1,a+2是各一維數(shù)組的首地址。 a=2000,a+1=2008,a+2=2016
66、 a[0]=2000 所以a=a[0]=&a[0][0]=2000,,(2) a[0]+1=2002, a[0]+2=2004, a[0]+3=2006 a+i=a[i] a[i]+j=&a[i][j],,(3) *(a[i]+j)=*(*(a+i)+j )例如: *(a+2) *(a+1)+3 *(*(a+1)+3),例 二維數(shù)組元素及地址的輸出main( ){sta
67、tic int i, j, a[2][2]={1, 3, 5, 7};printf(“a=%x, a[0]=%x, a[1]=%x\ n”,a,a[0],a[1]);printf(“a+0=%x, a+1=%x\ n”, a+0, a+1);for(i=0; i<2; i++)for(j=0; j<2; j++)printf(“*(a+%d)+%d=%x,a[%d]+%d=%x,&a[%d][%d]=
68、%x\ n”, i, j, *(a+i)+j,i, j, a[i]+j, i, j, &a[i][j]);for(i=0; i<2; i++)for(j=0; j<2; j++)printf(“a[%d][%d]=%d,*(a[%d]+%d)=%d,*a(*(a+%d)+%d=%d\ n”, i, j, a[i][j],i, j, *(a[i]+j), i, j, *(*(a+i)+j));},運行結(jié)果
69、:a=194, a[0]=194, a[1]=198a+0=194, a+1=198*(a+0)+0=194, a[0]+0=194, &a[0][0]=194*(a+0)+1=196, a[0]+1=196, &a[0][1]=196*(a+1)+0=198, a[1]+0=198, &a[1][0]=198*(a+1)+1=19a, a[1]+1=19a, &a[1][1]=19aa[0
70、][0]=1, *(a[0]+0)=1, *(*(a+0)+0)=1a[0][1]=3, *(a[0]+1)=3, *(*(a+0)+1)=3a[1][0]=5, *(a[1]+0)=5, *(*(a+1)+0)=5a[1][1]=7, *(a[1]+1)=7, *(*(a+1)+1)=7,a 、a[0] a[0]+0 194 1 a[0][0] a[0]+1
71、 196 3 a[0][1] a[1] a[1]+0 198 5 a[1][0] a[1]+1 19a 7 a[1][1],,,,,,,2.多維數(shù)組的指針,,(1)定義例: int a[3][4],*p; p=a; p=&a[0][0]; p=a[0];,,(2).指向多維數(shù)組
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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
提交評論