




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、UNIX C編程編程* Page 1第第11章章 指指 針針知識點:知識點:指針的定義指針的定義指針變量的運用指針變量的運用各種指針的運用各種指針的運用重點:重點:指針的概念及指針的概念及C言語指針運用的特點言語指針運用的特點指針變量的定義、援用指針變量的定義、援用數(shù)組的指針、字符串的指針、函數(shù)的指針、指向指針的指針的數(shù)組的指針、字符串的指針、函數(shù)的指針、指向指針的指針的運用運用難點:難點:指針的運算和運用指針的運算和運用指針在數(shù)組中的運用及運用特點指針在數(shù)組中的運用及運用特點UNIX C編程編程* Page 2q 指針是指針是C言語中的一個重要的概念,也是言語中的一個重要的概念,也是C言語的
2、一個重要言語的一個重要特征。特征。q 可以表示復(fù)雜的數(shù)據(jù)構(gòu)造可以表示復(fù)雜的數(shù)據(jù)構(gòu)造q 能動態(tài)分配內(nèi)存能動態(tài)分配內(nèi)存q 能方便地運用字符串能方便地運用字符串q 有效而方便地運用數(shù)組有效而方便地運用數(shù)組q 在調(diào)用函數(shù)時能得到多于在調(diào)用函數(shù)時能得到多于1個的值個的值q 能直接處置內(nèi)存地址等能直接處置內(nèi)存地址等第第11章章 指指 針針UNIX C編程編程* Page 3 x xxxyz 20002019 20192019 2020202111.1 地址和指針的概念地址和指針的概念q “直接訪問方式直接訪問方式q 按變量地址存取變量值的方式按變量地址存取變量值的方式int x,y,z;x=20,y=40
3、; z=x+y;x 40 x20yz 20002019 20192019 20202021 編譯系統(tǒng)把變量名轉(zhuǎn)換為變量的地址,對變量值的存取編譯系統(tǒng)把變量名轉(zhuǎn)換為變量的地址,對變量值的存取經(jīng)過地址進(jìn)展的。經(jīng)過地址進(jìn)展的。 內(nèi)存內(nèi)存x 406020yz 20002019 20192019 20202021變量變量z的地址的地址指針指針 UNIX C編程編程* Page 4 11.1 地址和指針的概念地址和指針的概念q “間接訪問方式間接訪問方式q 經(jīng)過存放變量地址的變量去訪問變量經(jīng)過存放變量地址的變量去訪問變量 int x,*x_point; x_point=&x;*x_point=20
4、;x x_point 20002019 20192019 x 2000 x_point 20002019 20192019 x 200020 x_point 20002019 20192019 指針指針專門存放變量地址的變量專門存放變量地址的變量指針變量指針變量*x_point指針變量指針變量變量變量變量地址(指針)變量值指向地址存入地址存入指針變量指針變量UNIX C編程編程* Page 511.1 地址和指針的概念地址和指針的概念整型變量整型變量x指針變量指針變量x_pointer2000201920192019201920192019整型變量整型變量k.102000 k=x; /*直接訪
5、問直接訪問*/ x_pointer=&x; k=*x_pointer; /*間接訪問間接訪問*/1010UNIX C編程編程* Page 6q 變量的指針變量的指針q 就是變量的地址就是變量的地址 q 指針變量指針變量q 存放變量地址的變量存放變量地址的變量q 用來指向另一個變量用來指向另一個變量 q 用用“*符號表示符號表示“指向指向11.2 變量的指針和指向變量的指針變量變量的指針和指向變量的指針變量UNIX C編程編程* Page 7q定義一個指針變量定義一個指針變量q 指針變量不同于整型變量和其他類型的變量,它是用來專門存指針變量不同于整型變量和其他類型的變量,它是用來專門存放
6、地址的。放地址的。q 必需將指針變量定義為必需將指針變量定義為“指針類型。指針類型。q 普通方式普通方式q 基類型基類型 *指針變量名指針變量名;q 基類型:指針變量所指向的變量的類型?;愋停褐羔樧兞克赶虻淖兞康念愋?。q 例例 float *pointer1;q int *pointer2;q char *pointer3;q 指針變量的定義是經(jīng)過指針變量的定義是經(jīng)過*進(jìn)展的進(jìn)展的q 定義后的指針變量只能賦值指針,不能賦值為普通數(shù)據(jù)類型定義后的指針變量只能賦值指針,不能賦值為普通數(shù)據(jù)類型11.2 變量的指針和指向變量的指針變量變量的指針和指向變量的指針變量UNIX C編程編程* Page
7、8q指針變量的援用指針變量的援用q & & 與與* *運算符運算符 - - 單目運算,優(yōu)先級單目運算,優(yōu)先級2 2,自右向左結(jié)合,自右向左結(jié)合q & & 取地址運算符取地址運算符q 取變量的地址,取出的地址一定是一個常數(shù)取變量的地址,取出的地址一定是一個常數(shù)q & &變量名變量名= =指針值指針值 q * * 指針運算符指針運算符q 指針變量所指向的內(nèi)存單元,可稱為指針變量所指的變量指針變量所指向的內(nèi)存單元,可稱為指針變量所指的變量q 與指針變量定義中的與指針變量定義中的* *不同不同q “* *指針變量指針變量 可以作為一個基類型變量來用可以作
8、為一個基類型變量來用11.2 變量的指針和指向變量的指針變量變量的指針和指向變量的指針變量UNIX C編程編程* Page 911.2 變量的指針和指向變量的指針變量變量的指針和指向變量的指針變量main()int a,b; int *pointer_1,*pointer_2; a=100;b=10; pointer_1=&a; /*把變量把變量a的地址賦給的地址賦給pointer_1*/ pointer_2=&b; /*把變量把變量b的地址賦給的地址賦給pointer_2*/ printf(%d,%dn,a,b); printf(%d,%dn,*pointer_1,*poin
9、ter_2); getch();100,10100,10UNIX C編程編程* Page 10v 指針變量的初始化指針變量的初始化v 普通方式普通方式 基類型基類型 *指針變量名指針變量名=初始地址值初始地址值;11.2 變量的指針和指向變量的指針變量變量的指針和指向變量的指針變量例例 int i; int i; int int * *p=&i;p=&i;例例 int i; int *p=&i; int *q=p;例例 int *p=&i; int i;用已初始化指針變量作初值用已初始化指針變量作初值ipqipUNIX C編程編程* Page 1111.2 變量
10、的指針和指向變量的指針變量變量的指針和指向變量的指針變量v 指針變量運用前必需先初始化或賦初值指針變量運用前必需先初始化或賦初值例例 main() int i=10, *p; *p=i; printf(“%d,*p); 指針變量指針變量p整型變量整型變量i2000201920192019201920192019.10201910內(nèi)容隨機內(nèi)容隨機結(jié)果:結(jié)果:10危危險險!例例 main( ) int i=10,k, *p; p=&k; *p=i; printf(“%d,*p); UNIX C編程編程* Page 12v 零指針與空類型指針零指針與空類型指針v 零指針:零指針:( (空指針
11、空指針) )v 定義:指針變量值為零定義:指針變量值為零v 表示:表示: int int * * p=0; p=0; 11.2 變量的指針和指向變量的指針變量變量的指針和指向變量的指針變量p指向地址為指向地址為0的單元,的單元,系統(tǒng)保證該單元不作他用系統(tǒng)保證該單元不作他用不存放有效數(shù)據(jù)不存放有效數(shù)據(jù)表示指針變量值沒有意義表示指針變量值沒有意義 NULL在在stdio.h中定義,原型為中定義,原型為#define NULL 0 int *p=NULL; 用途用途: 防止指針變量的非法援用防止指針變量的非法援用 在程序中常作為形狀比較在程序中常作為形狀比較 例 int *p; . while(p!
12、=NULL) . UNIX C編程編程* Page 1311.2 變量的指針和指向變量的指針變量變量的指針和指向變量的指針變量 空類型指針空類型指針 定義:指針變量不指向哪一種類型數(shù)據(jù)定義:指針變量不指向哪一種類型數(shù)據(jù) 表示:表示: void *p; 運用時要進(jìn)展強迫類型轉(zhuǎn)換運用時要進(jìn)展強迫類型轉(zhuǎn)換表示不指定表示不指定p2是指向哪一種是指向哪一種類型數(shù)據(jù)的指針變量類型數(shù)據(jù)的指針變量例例 char *p1; void *p2; p1=(char *)p2; p2=(void *)p1;UNIX C編程編程* Page 1411.2 變量的指針和指向變量的指針變量變量的指針和指向變量的指針變量pa
13、affdaffdeffe0ffdfffdbffdcffdd.ffda10main()int a; int *pa=&a; a=10; printf(a=%d, *pa=%d n,a,*pa); printf(“&a=%x(hex) ,&a); printf(pa=%x(hex) n,pa); printf(&pa=%x(hex)n,&pa); getch();a=10,*pa=10&a=ffda(hex),pa=ffda(hex)&pa=ffde(hex)UNIX C編程編程* Page 15 練習(xí)練習(xí)11.2 變量的指針和指向變量的指針
14、變量變量的指針和指向變量的指針變量 int x,y,*x_pointer,*y_pointer;x_pointer&xx2y_pointer&yy4 x_pointer=&x;y_pointer=&y;y_pointer=&*x_pointer;y=*&x;2 &與*運算符右結(jié)合 *右側(cè)接指針變量,如:*x_pointer &右側(cè)接普通變量,如:&xUNIX C編程編程* Page 16q指針變量作為函數(shù)參數(shù)指針變量作為函數(shù)參數(shù)q 作用是將變量的地址傳送到另一個函數(shù)中作用是將變量的地址傳送到另一個函數(shù)中11.2 變量的指針
15、和指向變量的指針變量變量的指針和指向變量的指針變量swap(int *p1,int *p2)int temp; temp=*p1; *p1=*p2; *p2=temp;main() int a,b,*pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab) swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);pointer_1?a?pointer_2?b?5,9 59&a&b&ap1&bp2?t
16、emp595pointer_1&aa9pointer_2&bb59,5UNIX C編程編程* Page 1711.2 變量的指針和指向變量的指針變量變量的指針和指向變量的指針變量swap(int *p1,int *p2) int *temp,x; temp=&x; *temp=*p1; *p1=*p2; *p2=*temp;main() int a,b,*pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab) swap(pointer_1,p
17、ointer_2); printf(n%d,%dn,a,b);pointer_1?a?pointer_2?b?59&a&b&ap1&bp29?temp?x&xtemp?x55pointer_1&aa9pointer_2&bb55,9 9,5UNIX C編程編程* Page 1811.2 變量的指針和指向變量的指針變量變量的指針和指向變量的指針變量swap(int *p1,int *p2) int *temp; temp=p1; p1=p2; p2=temp;main() int a,b,*pointer_1,*pointer_2; sca
18、nf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab) swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);pointer_1?a?pointer_2?b?59&a&b&ap1&bp2?temp5,9 5,9&atemp&b&apointer_1&aa5pointer_2&bb9UNIX C編程編程* Page 19q 想經(jīng)過函數(shù)調(diào)用得到想經(jīng)過函數(shù)調(diào)用得到n n個要改動的值,可以:個要改動的值,可以:q
19、 在主調(diào)函數(shù)中設(shè)在主調(diào)函數(shù)中設(shè)n n個變量,用個變量,用n n個指針變量指向它們個指針變量指向它們q 將指針變量作實參,將這將指針變量作實參,將這n n個變量的地址傳給所調(diào)用的函個變量的地址傳給所調(diào)用的函數(shù)的形參數(shù)的形參q 經(jīng)過形參指針變量,改動該經(jīng)過形參指針變量,改動該n n個變量的值個變量的值q 主調(diào)函數(shù)中就可以運用這些改動了值的變量主調(diào)函數(shù)中就可以運用這些改動了值的變量11.2 變量的指針和指向變量的指針變量變量的指針和指向變量的指針變量UNIX C編程編程* Page 2011.2 變量的指針和指向變量的指針變量變量的指針和指向變量的指針變量 例:輸入例:輸入a、b、 c3個整數(shù),按大
20、小順序輸出。個整數(shù),按大小順序輸出。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); printf(n%d,%d,%dn,a,b,c);swap(int *pt1, int *pt2) int temp; temp=*pt1; pt1=*pt2; *pt2=temp; exchange(int *q1, int *q2, int *q3) if(*q1*q2) swap(q1,q2); if(*q1*q3)
21、swap(q1,q3); if(*q2a1a+1UNIX C編程編程* Page 25v 指針的關(guān)系運算指針的關(guān)系運算v 本質(zhì)是兩個地址之間的比較,地本質(zhì)是兩個地址之間的比較,地址大的指針大,地址小的指針小址大的指針大,地址小的指針小v pqv p=qv pqv p=qv p=qv p!=q11.3 數(shù)組與指針數(shù)組與指針a2a3a4 2000 2019 a1a020002019201920192019200A2024202220202019pqqpUNIX C編程編程* Page 26v 援用數(shù)組元素的方法援用數(shù)組元素的方法v int a5,*p;v p=a;11.3 數(shù)組與指針數(shù)組與指針下標(biāo)
22、法下標(biāo)法 ai和和pia2a3a4 2000 a1a020002019201920192019200A2024202220202019p pap0p1p2p3p4指針法指針法 *(a+i)和和* (p+i)pp+1p+2p+3p+4aa+1a+2a+3a+4a2a3a4 2000 a1a020002019201920192019200A2024202220202019p p+5UNIX C編程編程* Page 27v 例例 輸出數(shù)組中的全部元素輸出數(shù)組中的全部元素11.3 數(shù)組與指針數(shù)組與指針main() int a10=1,2,3,4,5,6,7,8,9,10,*p,i; for (i=0;
23、i10;i+) printf(“%4d,ai);用下標(biāo)法援用數(shù)組元素用下標(biāo)法援用數(shù)組元素UNIX C編程編程* Page 28main() int a10=1,2,3,4,5,6,7,8,9,10,*p,i; for (i=0;i10;i+) printf(“%4d,*(a+i); 11.3 數(shù)組與指針數(shù)組與指針 用指針法援用數(shù)組元素用指針法援用數(shù)組元素 數(shù)組名數(shù)組名a在計算過程中代表數(shù)組的首地址在計算過程中代表數(shù)組的首地址 對對ai進(jìn)展變址運算,轉(zhuǎn)化為進(jìn)展變址運算,轉(zhuǎn)化為*(a+i)UNIX C編程編程* Page 29 main() int a10=1,2,3,4,5,6,7,8,9,10
24、,*p,i; for (p=a;p(a+10);p+) printf(“%4d,*p); 11.3 數(shù)組與指針數(shù)組與指針 p的初值為數(shù)組的初值為數(shù)組a的起始地址的起始地址 計算過程中運用了指針加法計算過程中運用了指針加法 數(shù)組名數(shù)組名a在計算過程中代表數(shù)組的首地址在計算過程中代表數(shù)組的首地址UNIX C編程編程* Page 30main() int a10=1,2,3,4,5,6,7,8,9,10,*p,i; for (p=a,i=0;i10;i+) printf(“%4d, pi); 11.3 數(shù)組與指針數(shù)組與指針 用下標(biāo)法援用數(shù)組元素用下標(biāo)法援用數(shù)組元素 p的初值為數(shù)組的初值為數(shù)組a的起始
25、地址的起始地址UNIX C編程編程* Page 3111.3 數(shù)組與指針數(shù)組與指針main() int i,*p,a10; p=a; for(i=0;i10;i+) scanf(%d,p+); printf(n); for(i=0;i10;i+,p+) printf(%d,*p);for(i=0;i10;i+) scanf(%d,p); p+; 1 2 3 4 5 6 7 8 9 0 22153 234 0 0 30036 25202 11631 8259 8237 28483a2a3a4 a9 ? ? ? a1a020002019201920192019200A202420222020201
26、9 pp=a;1 2 3 4 5 6 7 8 9 0v例例 經(jīng)過指針變量輸出經(jīng)過指針變量輸出a數(shù)組的數(shù)組的10個元素個元素UNIX C編程編程* Page 32 main() int a =5,8,7,6,2; int y,*p=&a1; y=(*-p)+; printf(%d ,y); printf(%d,a0); 11.3 數(shù)組與指針數(shù)組與指針a27a36a42 a18a0520002019201920192019200A2024202220202019 pp65y5 6例:例:UNIX C編程編程* Page 33q用數(shù)組名作函數(shù)參數(shù)用數(shù)組名作函數(shù)參數(shù)q 數(shù)組名作函數(shù)實參,傳送給
27、形參的是地址地址傳送數(shù)組名作函數(shù)實參,傳送給形參的是地址地址傳送q 傳送的地址是數(shù)組的首地址,形參接納的是數(shù)組的首地址傳送的地址是數(shù)組的首地址,形參接納的是數(shù)組的首地址q 形參定義時為數(shù)組,形參數(shù)組的維數(shù)可省略一維數(shù)組形參定義時為數(shù)組,形參數(shù)組的維數(shù)可省略一維數(shù)組q 實踐上,編譯系統(tǒng)把形參數(shù)組名作為指針變量來處置實踐上,編譯系統(tǒng)把形參數(shù)組名作為指針變量來處置11.3 數(shù)組與指針數(shù)組與指針UNIX C編程編程* Page 34 前面曾經(jīng)分析,指向數(shù)組的指針變量可以經(jīng)過指針法,也前面曾經(jīng)分析,指向數(shù)組的指針變量可以經(jīng)過指針法,也可以經(jīng)過下標(biāo)法援用數(shù)組元素,所以可以經(jīng)過下標(biāo)法援用數(shù)組元素,所以11.
28、3 數(shù)組與指針數(shù)組與指針void f(int b )printf(len of b is %dByten,sizeof(b); printf(a1=%d,b1); main() int a3=1,2,3; f(a);len of b is 2Bytea1=2v 例:例:void f(int *b)printf(a1=%d,*(b+1);1232000bba20002ByteUNIX C編程編程* Page 35v 數(shù)組名作函數(shù)參數(shù),實參與形參的對應(yīng)關(guān)系數(shù)組名作函數(shù)參數(shù),實參與形參的對應(yīng)關(guān)系11.3 數(shù)組與指針數(shù)組與指針實參實參形參形參數(shù)組名數(shù)組名指針變量指針變量數(shù)組名數(shù)組名指針變量指針變量數(shù)組
29、名數(shù)組名數(shù)組名數(shù)組名指針變量指針變量指針變量指針變量UNIX C編程編程* Page 36 例例 將數(shù)組將數(shù)組a中中n個整數(shù)按相反順序存放個整數(shù)按相反順序存放11.3 數(shù)組與指針數(shù)組與指針?biāo)惴ǎ核惴ǎ?設(shè)兩個設(shè)兩個“位置指示變量位置指示變量i和和j,i的初值為的初值為0,j的初值為的初值為n-1 將將ai與與aj交換交換 使使i的值加的值加1,j的值減的值減1 再將再將ai與與aj對換,直到對換,直到i=(n-1)/2為止為止main()int i,a10=3,7,9,11,0,6,7,5,4,2; printf(The original array:n); for(i=0;i10;i+)pr
30、intf(%d,ai); printf(n); inv(a,10); printf(The array has been inverted:n); for(i=0;i10;i+)printf(%d,ai); printf(n);UNIX C編程編程* Page 37void inv(int x ,int n) int temp,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; temp=xi; xi=xj; xj=temp; 11.3 數(shù)組與指針數(shù)組與指針90a29a311a40 a56 a67 a75 a84 a92a17a0320002019201920192
31、019200A20192019200E200Cm=4a29a311a40 a56 a67 a75 a84 a93a17a0220002019201920192019200A20192019200E200Cm=418a29a311a40 a56 a67 a75 a87 a93a14a0220002019201920192019200A20192019200E200Cm=427a25a311a40 a56 a67 a79 a87 a93a14a0220002019201920192019200A20192019200E200Cm=436a25a37a40 a56 a611 a79 a87 a93a
32、14a0220002019201920192019200A20192019200E200Cm=445xa25a37a46 a50 a611 a79 a87 a93a14a0220002019201920192019200A20192019200E200Cm=45ijUNIX C編程編程* Page 38void inv(int *x,int n) int *p,temp,*i,*j,m=(n-1)/2; i=x;j=x+n-1;p=x+m; for(;i=p;i+,j-) temp=*i; *i=*j; *j=temp; 11.3 數(shù)組與指針數(shù)組與指針jia29a311a40 a56 a67
33、a75 a84 a92a17a0320002019201920192019200A20192019200E200Cm=4a29a311a40 a56 a67 a75 a84 a93a17a0220002019201920192019200A20192019200E200Cm=4ija29a311a40 a56 a67 a75 a87 a93a14a0220002019201920192019200A20192019200E200Cm=4ija25a311a40 a56 a67 a79 a87 a93a14a0220002019201920192019200A20192019200E200Cm=
34、4ija25a37a40 a56 a611 a79 a87 a93a14a0220002019201920192019200A20192019200E200Cm=4ijxpa25a37a46 a50 a611 a79 a87 a93a14a0220002019201920192019200A20192019200E200Cm=4ijUNIX C編程編程* Page 39q多維數(shù)組與指針多維數(shù)組與指針q 多維數(shù)組的地址多維數(shù)組的地址q int a34=1,3,5,7,9,11,13,15,17,19,21,23;q 可以把可以把a看作是一維數(shù)組,有看作是一維數(shù)組,有3個元素:個元素:a0,a1,
35、a2q a0,a1,a2可以分別以為是包含可以分別以為是包含4個元素的一維數(shù)組個元素的一維數(shù)組q 二維數(shù)組是數(shù)組的數(shù)組二維數(shù)組是數(shù)組的數(shù)組11.3 數(shù)組與指針數(shù)組與指針a00a01a02a03a10a11a12a13a20a21a22a23aa00a01a02a03a10a11a12a13a20a21a22a23一維數(shù)組一維數(shù)組aa0a1a2一維數(shù)組一維數(shù)組a0UNIX C編程編程* Page 4011.3 數(shù)組與指針數(shù)組與指針201920192000a0a1 a2202120192019200020192019a00a01a10a11a20a21a02a03a12a13a22a23aa+1a
36、+2*(*(a+0)+1)元素元素a01可表示為可表示為*(a0+1)a0為數(shù)組名,是為數(shù)組名,是該數(shù)組的首地址該數(shù)組的首地址a0+1a1+1a2+1從從a數(shù)組中數(shù)組中a0可表示可表示*(a+0)所以所以a0+1 *(a+0)+1*(a+1)+1*(a+2)+1UNIX C編程編程* Page 4111.3 數(shù)組與指針數(shù)組與指針qa-二維數(shù)組的首地址,即第二維數(shù)組的首地址,即第0行的行的首地址首地址qa+i-第第i行的首地址行的首地址qai *(a+i)-第第i行第行第0列的元素地列的元素地址址qai+j *(a+i)+j -第第i行第行第j列的元列的元素地址素地址q*(ai+j) *(*(a
37、+i)+j) aija+i=&ai=ai=*(a+i) =&ai0,值相等,含義不同,值相等,含義不同a+i &ai,表示第表示第i行首地址,指向行行首地址,指向行ai *(a+i) &ai0,表示第,表示第i行第行第0列元素地址,指向列列元素地址,指向列UNIX C編程編程* Page 42#define FORMAT%x,%xn#define FORMAT1 %d,%dnmain()int a34=1,3,5,7,9,11,13,15,17,19,21,23; printf(FORMAT,a,*a); printf(FORMAT,a0,*(a+0); pri
38、ntf(FORMAT,&a0,&a00); printf(FORMAT,a1,a+1); printf(FORMAT,&a10,*(a+1)+0); printf(FORMAT,a2,*(a+2); printf(FORMAT,&a2,a+2); printf(FORMAT1,a10,*(*(a+1)+0);11.3 數(shù)組與指針數(shù)組與指針例例 輸出二維數(shù)組有關(guān)的值。輸出二維數(shù)組有關(guān)的值。ffb8,ffb8ffb8,ffb8ffb8,ffb8ffc0,ffc0ffc0,ffc0ffc8,ffc8ffc8,ffc89,9UNIX C編程編程* Page 4311.3
39、 數(shù)組與指針數(shù)組與指針201920192000a0a1 a2202120192019200020192019a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2a0+1a1+1a2+1*(a+0)+1*(a+1)+1*(a+2)+1可以為可以為存儲的存儲的是數(shù)組是數(shù)組a0的的首地址首地址*(*(a+0)+1)*(a0+1)UNIX C編程編程* Page 4411.3 數(shù)組與指針數(shù)組與指針v 指向多維數(shù)組元素的指針變量指向多維數(shù)組元素的指針變量v 指向數(shù)組元素的指針變量指向數(shù)組元素的指針變量main()int a34=1,3,5,7,9,11,13,15,17
40、,19,21,23; int *p; for(p=a0;pa0+12;p+) if(p-a0)%4=0) printf(n); printf(%4d,*p); 1 3 5 7 9 11 13 15 17 19 21 23p指向數(shù)組首元素指向數(shù)組首元素第第13個元素的首地址個元素的首地址p指針指向下一個元素指針指向下一個元素UNIX C編程編程* Page 4511.3 數(shù)組與指針數(shù)組與指針 在在int anm數(shù)組中求數(shù)組中求aij的首地址的首地址a00a0ja0m-1ai0aijan-10an-1m-1&aij=&a00+i*m+ji行行j列列UNIX C編程編程* Page
41、4611.3 數(shù)組與指針數(shù)組與指針 指向由指向由m個元素組成的一維數(shù)組的指針變量個元素組成的一維數(shù)組的指針變量 定義方式定義方式 數(shù)據(jù)類型數(shù)據(jù)類型 (*指針變量名指針變量名)一維數(shù)組的維數(shù)一維數(shù)組的維數(shù) 例:例:int (*p)4,可以以為數(shù)組稱號為,可以以為數(shù)組稱號為*p(*p)0(*p)1(*p)2(*p)3p p只能指向包含只能指向包含4個元素的一維數(shù)組個元素的一維數(shù)組(p是該數(shù)組的首地址是該數(shù)組的首地址) 可讓可讓p指向二維數(shù)組的某一行指向二維數(shù)組的某一行 例:例:int a34, (*p)4=a; 一維數(shù)組指針變量維數(shù)和二維數(shù)組列數(shù)必需一樣一維數(shù)組指針變量維數(shù)和二維數(shù)組列數(shù)必需一樣*
42、p代表本行第一列的地址代表本行第一列的地址UNIX C編程編程* Page 4711.3 數(shù)組與指針數(shù)組與指針202120192019200020192019a00a01a10a11a20a21a02a03a12a13a22a23pp+1p+2 *(p)+1*(p+1)+1*(p+2)+1*(*(p+1)+1)UNIX C編程編程* Page 48v 用指向多維數(shù)組的指針作函數(shù)參數(shù)用指向多維數(shù)組的指針作函數(shù)參數(shù)v指針變量作形參接受實參數(shù)組名傳送來的地址時,可以指針變量作形參接受實參數(shù)組名傳送來的地址時,可以v 用指向變量的指針變量用指向變量的指針變量v 用指向一維數(shù)組的指針變量用指向一維數(shù)組的
43、指針變量v例例 有一個班,有一個班,3 3個學(xué)生,各學(xué)個學(xué)生,各學(xué)4 4門課,計算總平均分?jǐn)?shù),以門課,計算總平均分?jǐn)?shù),以及第及第n n個學(xué)生的成果。個學(xué)生的成果。11.3 數(shù)組與指針數(shù)組與指針UNIX C編程編程* Page 4911.3 數(shù)組與指針數(shù)組與指針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); getch();void
44、average(float *p,int n) float *p_end; float sum=0,aver; p_end=p+n-1;/*最后一行最后一個學(xué)生最后一列最后一門成果的首地址最后一行最后一個學(xué)生最后一列最后一門成果的首地址*/ for(;p=p_end;p+) sum=sum+(*p); aver=sum/n; printf(naverage= %5.2f n,aver); void search(float (*p)4,int n) int i; printf(the score of No.%d are:n,n); for(i=0;iy?x:y);11.5 指向函數(shù)的指針指向
45、函數(shù)的指針UNIX C編程編程* Page 6011.5 指向函數(shù)的指針指向函數(shù)的指針q 用指向函數(shù)的指針作函數(shù)參數(shù)用指向函數(shù)的指針作函數(shù)參數(shù)q 例例 用函數(shù)指針變量作參數(shù),求最大值、最小值和兩數(shù)之和。用函數(shù)指針變量作參數(shù),求最大值、最小值和兩數(shù)之和。 main() int max(int,int); int min(int,int); int add(int,int); void process(int,int,int (*fun)(); int a,b; scanf(%d,%d,&a,&b); process(a,b,max); process(a,b,min); proc
46、ess(a,b,add);void process(int x,int y,int (*fun)() int result; result=(*fun)(x,y); printf(%dn,result);max(int x,int y) printf(“max=); return(xy?x:y);min(int x,int y) printf(“min=); return(x*y) return x; else return y;main() int a=2,b=3; int *p; p=f1(&a, &b); printf(%dn,*p);2a3b?p調(diào)用函數(shù)前調(diào)用函數(shù)前xy
47、*x*y調(diào)用函數(shù)調(diào)用函數(shù)2a3b?p2a3bp調(diào)用函數(shù)后調(diào)用函數(shù)后UNIX C編程編程* Page 632a3b?p調(diào)用函數(shù)前調(diào)用函數(shù)前11.6前往指針值的函數(shù)前往指針值的函數(shù)int *f1(int x,int y) if(xy) return &x; else return &y;main() int a=2,b=3; int *p; p=f1(a, b); printf(%dn,*p);xy調(diào)用函數(shù)調(diào)用函數(shù)2a3b?p23調(diào)用函數(shù)后調(diào)用函數(shù)后2a3bp?!不能把形參或部分變量的地址作函數(shù)前往值不能把形參或部分變量的地址作函數(shù)前往值不確定不確定UNIX C編程編程* Page
48、 6411.7指針數(shù)組和指向指針的指針指針數(shù)組和指向指針的指針q指針數(shù)組的概念指針數(shù)組的概念q 數(shù)組中的元素為指針變量數(shù)組中的元素為指針變量 q 定義方式定義方式q 數(shù)據(jù)類型數(shù)據(jù)類型 *數(shù)組名數(shù)組名數(shù)組長度數(shù)組長度q int *p4;char *name5;(元素元素)指針變量所指數(shù)據(jù)的數(shù)據(jù)類型指針變量所指數(shù)據(jù)的數(shù)據(jù)類型區(qū)分區(qū)分int *p4與與int (*p)4v 用指針數(shù)組執(zhí)行假設(shè)干字符串,可以節(jié)省內(nèi)存單元以及用指針數(shù)組執(zhí)行假設(shè)干字符串,可以節(jié)省內(nèi)存單元以及處置靈敏處置靈敏Followme0BASIC0GreatWall0FORTRAN0Computerdesign0name0name1n
49、ame3name2name4Follow meBASICGreat WallFORTRANComputer designname用二維數(shù)組,用二維數(shù)組,浪費存儲空間浪費存儲空間UNIX C編程編程* Page 65#include void sort(char *name,int n) char *temp; int i,j,k; for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; main() char *name=Follow me,BASIC, Great Wall,
50、FORTRAN,Computer ; int n=5; sort(name,n); print(name,n);例:將假設(shè)干字符串按字母順序由小到大輸例:將假設(shè)干字符串按字母順序由小到大輸出出定義指針數(shù)組定義指針數(shù)組傳送指針數(shù)組傳送指針數(shù)組name的首地址的首地址namek,第第k個字符串個字符串的首地址,進(jìn)展字符串的首地址,進(jìn)展字符串比較比較元素交換指針元素交換指針void print(char *name,int n) int i; for (i=0;in;i+) printf (%sn,namei);name0name1name3name2name4Follow meBASICGreat
51、 WallFORTRANComputer designnamename0name1name3name2name4Follow meBASICGreat WallFORTRANComputer designnameUNIX C編程編程* Page 6611.7指針數(shù)組和指向指針的指針指針數(shù)組和指向指針的指針q指向指針的指針指向指針的指針q 指向指針數(shù)據(jù)的指針變量指向指針數(shù)據(jù)的指針變量(即指針變量存放的是指針變即指針變量存放的是指針變量的地址量的地址)q 定義方式定義方式q 數(shù)據(jù)類型數(shù)據(jù)類型 *指針名指針名最終目的變量的數(shù)據(jù)類型最終目的變量的數(shù)據(jù)類型v 例:例:v int c=5,*p,*q;v
52、p=&c;q=&p; 5c&cp*p&pq*q*q printf(%d,%d,%d,c,*p,*q); 5,5,5UNIX C編程編程* Page 6711.7指針數(shù)組和指向指針的指針指針數(shù)組和指向指針的指針main()char *a=hello,world,China,*p; int i; for (p=a,i=0;i3;i+) printf(n*a%d=%s,i,*(p+i);a0helloa1worlda2Chinaapp+1p+2*(a+i)能否可以?能否可以?*a0=hello*a1=world*a2=ChinaUNIX C編程編程* Page 681
53、1.7指針數(shù)組和指向指針的指針指針數(shù)組和指向指針的指針main()char *a=hello,world,China,*p; int i; p=a; for (i=0;i copy.exe source.c temp.c11.7指針數(shù)組和指向指針的指針指針數(shù)組和指向指針的指針有有3個字符串參數(shù)的命令行個字符串參數(shù)的命令行v 帶參數(shù)的main函數(shù)方式:main(int argc, char *argv) 元素指向命令行參數(shù)中各元素指向命令行參數(shù)中各字符串首地址字符串首地址命令行中參數(shù)個數(shù)命令行中參數(shù)個數(shù)命令行命令行 實參表實參表main(形參表形參表)系統(tǒng)自動調(diào)用系統(tǒng)自動調(diào)用main函數(shù)時傳送函
54、數(shù)時傳送v 命令行參數(shù)傳送命令行參數(shù)傳送第一個參數(shù)第一個參數(shù): main所在所在的可執(zhí)行文件名的可執(zhí)行文件名UNIX C編程編程* Page 7011.7指針數(shù)組和指向指針的指針指針數(shù)組和指向指針的指針/*test.c*/main(int argc, char *argv) while(argc1) argv=argv+1; printf(%sn,*argv); -argc; 編譯、鏈接編譯、鏈接test.c,生成可執(zhí)行文件,生成可執(zhí)行文件test.exe 在在DOS形狀下運轉(zhuǎn)形狀下運轉(zhuǎn)(test.exe所在途徑下所在途徑下) C:TC test.exe hello world!hellowo
55、rld!v 例例argv0argv1argv2char *argvargvargc=3testhelloworldUNIX C編程編程* Page 71q 指向構(gòu)造體變量的指針指向構(gòu)造體變量的指針q 定義方式定義方式 struct struct 構(gòu)造體名構(gòu)造體名 * *構(gòu)造體指針名構(gòu)造體指針名; ;11.8 指向構(gòu)造體的指針指向構(gòu)造體的指針例例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student s,*p; p=&s; pnumname20s
56、exagescoreaddr20sp-nump-namep-sexp-agep-scorep-addr援用成員援用成員(*p).num(*p).name(*p).sex(*p).age(*p).score(*p).addr援用成員援用成員s.sexs.ages.scores.addr援用成員援用成員UNIX C編程編程* Page 72q 指向構(gòu)造體數(shù)組的指針指向構(gòu)造體數(shù)組的指針11.8 指向構(gòu)造體的指針指向構(gòu)造體的指針numname20sexagescoreaddr30stu0stu1stu2pstup+1p+2printf(%5d %-20s %2c %4dn, p-
57、num, p-name, p-sex, p-age);UNIX C編程編程* Page 73q 用指向構(gòu)造體的指針作為函數(shù)參數(shù)用指向構(gòu)造體的指針作為函數(shù)參數(shù)q 構(gòu)造體指針做函數(shù)參數(shù),傳地址構(gòu)造體指針做函數(shù)參數(shù),傳地址11.8 指向構(gòu)造體的指針指向構(gòu)造體的指針UNIX C編程編程* Page 7411.8 指向構(gòu)造體的指針指向構(gòu)造體的指針#define FORMAT %dn%sn%fn%fn%fnstruct student int num; char name20; float score3; stu=12345,Li Li,67.5,89,78.6;main() void print(str
58、uct student *); /*形參類型修正成指向構(gòu)造體形參類型修正成指向構(gòu)造體的指針變量的指針變量*/ print(&stu); /*實參改為實參改為stu的起始地址的起始地址*/ void print(struct student *p) /*形參類型修正了形參類型修正了*/ printf(FORMAT,p-num,p-name,p-score0,p-score1,p-score2);/*用指針變量調(diào)用各成員之值用指針變量調(diào)用各成員之值*/ printf(n); UNIX C編程編程* Page 75例:構(gòu)造體數(shù)組作函數(shù)參數(shù)例:構(gòu)造體數(shù)組作函數(shù)參數(shù) 打印打印2名學(xué)生的名學(xué)生的3
59、門成果門成果struct student int num; char name20; int score3;stu2;void input(struct student stu1)int i,j; for(i=0;i2;i+) printf(input NO.:); scanf(%d,&stu1i.num); printf(input name:); scanf(%s,); for(j=0;j3;j+) printf(input score%d:,j); scanf(%d,&stu1i.scorej); void print(struct student s
60、tu2)int i,j; for(i=0;i2;i+) printf(n NO. %d,stu2i.num); printf(n name %s,); for(j=0;j3;j+) printf(n %d score %d,j+1,stu2i.scorej); main()clrscr(); input(stu); print(stu); getch();UNIX C編程編程* Page 76q鏈表是一種常見的數(shù)據(jù)構(gòu)造,是可以動態(tài)地分配存儲空間鏈表是一種常見的數(shù)據(jù)構(gòu)造,是可以動態(tài)地分配存儲空間的一種構(gòu)造。的一種構(gòu)造。q數(shù)組是一種靜態(tài)地分配存儲空間的方式數(shù)組是一種靜態(tài)地分配存儲空間的方式11.9用指針處置鏈表用指針處置鏈表head1249C10211475DNULL1021B14756A61249ABC Dpq鏈表的構(gòu)成:鏈表的構(gòu)成:q 頭指針
溫馨提示
- 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 專項施工方案
- 穿孔鋁板龍骨施工方案
- 公路擋土墻施工方案
- 二零二五年度醫(yī)院醫(yī)護(hù)人員正式勞動合同范本發(fā)布
- 2025年度航空航天技術(shù)合作意向協(xié)議合同
- 二零二五年度農(nóng)村宅基地使用權(quán)轉(zhuǎn)讓與農(nóng)村集體產(chǎn)權(quán)制度改革合同
- 2025年度洗衣店門店經(jīng)營權(quán)轉(zhuǎn)讓協(xié)議
- 2025年洗車機租賃與新能源汽車充電設(shè)施配套服務(wù)合同
- 二零二五年度醫(yī)療機構(gòu)保安臨時工服務(wù)協(xié)議
- QC成果:降低低壓臺區(qū)線損率
- (完整版)GHS標(biāo)識(高清)
- 常見蔬菜種子千粒重及播種量
- 化學(xué)教學(xué)論(課堂PPT)
- 抗滑樁+預(yù)應(yīng)力錨索施工方案
- 2017版和2002版醫(yī)療器械分類目錄對比完整版
- 飲水機濾芯更換記錄表
- 2021年廣州市事業(yè)單位《公共基礎(chǔ)知識》1000題必考題庫
- 養(yǎng)老保險及職業(yè)年金相關(guān)解釋PPT課件
- 薄膜開關(guān)FQC作業(yè)指導(dǎo)書QC-110
- 自動控制理論52頻域:伯德圖
評論
0/150
提交評論