版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、程序設(shè)計(jì)語(yǔ)言C,信息與計(jì)算科學(xué)教研室 GCGSTAFF.SHU.EDU.CN,第七章 指針,1 指針概念 2 指針變量定義 3 指針與一維數(shù)組 4 指針與函數(shù) 5 指針與二維數(shù)組 6 指針與字符串,1 指針概念,內(nèi)存,變量,數(shù)組,地址都與其存儲(chǔ)地址有關(guān). int a=10,*p= printf(“%x %d”,p,*p) 地址變量數(shù)據(jù)在內(nèi)存存貯位置 /*定義p是指向整型變量的指針變量*/ float *y; /*定義y是指向?qū)嵭妥兞康闹羔樧兞?/ char *s; /*定義s是指向字符型變量的指針變量*/ 定義指針變量時(shí)可以對(duì)它初始化 int i; int *p = ,取址運(yùn)算符 變量x的值賦
2、給指針指向的變量 指針定義中 int *p :定義指針 程序使用中 y=*p : 指針取值運(yùn)算, 賦值=int a,*b,*c;b= p+ */,例1 指針的概念 main ( ) int x, *p; p = ,運(yùn)行結(jié)果 x: 20 *p: 20 p1 = ,結(jié)果:a+b=18 a-b=2,3 指針與一維數(shù)組,指針p指向一維數(shù)組a即p= 區(qū)別:數(shù)組a是常量, 不能進(jìn)行增量運(yùn)算。 a+i為ai的地址, *a就是a0, *(a+i)就是ai 而指針p是變量, 可作增量運(yùn)算p+。,3 指針與一維數(shù)組,3 指針與一維數(shù)組,下標(biāo)法與指針?lè)ū硎镜牡葍r(jià)性 1.數(shù)組名作為指針常量 若int a5, *p;則
3、數(shù)組名a表示數(shù)組首地址,p= 2. 在指針中使用下標(biāo)運(yùn)算符 下標(biāo)運(yùn)算符等同于取值運(yùn)算符,即p2等價(jià)于*(p+2),以下4個(gè)式子等價(jià): a2 *(p+2) *(a+2) p2,3 指針與一維數(shù)組,例3 數(shù)組排序 法1 數(shù)組法 int i,j,a10,x,*p=a; for(i=0;i9;I+)for(j=I+1;j10;j+) if (aIaj)x=ai;ai=aj;aj=x; 法2 數(shù)組指針?lè)?*p=a;ap) if (pIpj)x=pi;pi=pj;pj=x;,3 指針與一維數(shù)組,法3 指針變量法 int i,j,a10,x,*p=a; for(i=0;i9;i+) for(j=i+1;j1
4、0;j+) if (*(p+i)*(p+j) x= *(p+i) ; *(p+i) = *(p+j); *(p+j) =x; 法4 指針數(shù)組法(pa),3 指針與一維數(shù)組,法5 移動(dòng)指針?lè)?int i,j,a10,x,*p=a; for(i=0; i10;i+) scanf(“%d”,p+); p=a; for(i=0;i10;i+) printf(“%d ”,*p);p+;,4 指針與函數(shù),指針作為函數(shù)參數(shù) 1.傳遞單個(gè)指針 將單個(gè)變量的指針傳遞給函數(shù)往往是為了讓函數(shù)能通過(guò)該指針?lè)催^(guò)來(lái)修改主調(diào)函數(shù)的變量值,典型的例子就是scanf函數(shù),輸入整型量n的語(yǔ)句為: scanf( %d, 調(diào)用函數(shù)將
5、變量n的指針(c=a;a=b;b=c;return; Void f(int *p,int *q) int c;c=*p;*p=*q;*q=c;return; Main()int a=1,b=2,*p=(地址傳遞),4 指針與函數(shù),2.傳遞數(shù)組 當(dāng)編寫函數(shù)對(duì)數(shù)組做某種計(jì)算時(shí),需要將數(shù)組的的信息傳遞到函數(shù)中,這就是傳遞數(shù)組,在C語(yǔ)言中,傳遞數(shù)組采用傳址方式,傳遞的其實(shí)是數(shù)組的首地址。 【例5】編寫函數(shù),查找字串中給定的字符。,4 指針與函數(shù),例5 查找字串中給定的字符 Char *s(char *str,char c) char *p=str; While (*p ,4 指針與函數(shù),3.指針做為函
6、數(shù)返回類型 例6.編寫函數(shù),在一個(gè)已從小到大排序的數(shù)組中查找一個(gè)指定的數(shù),如果找到,返回指向數(shù)組中該數(shù)的指針,否則返回空指針。 #include int *find( int *a, int n, int data ) /* 數(shù)組為a,個(gè)數(shù)為n,查找的數(shù)為data */ int *p, *q, *r; p = a; /* p指向待查找區(qū)域的首部 */ q = a+n; /* q指向區(qū)域的尾部的下一個(gè)位置 */,4 指針與函數(shù),while ( p q ) /* 待查找區(qū)不為空時(shí) */ r = p + (q-p)/2; /* 待查找區(qū)的中點(diǎn)位置 */ if ( *r = data ) return
7、 r; /* 如果找到,返回該指針 */ else if ( *r data ) p = r + 1; /* 比中點(diǎn)大,在后半?yún)^(qū) */ else q = r; /* 比中點(diǎn)小,在前半?yún)^(qū) */ return NULL; /* 待查區(qū)為空,沒(méi)找到 */ ,4 指針與函數(shù),main() int x=11, 22, 33, 44, 55, 66, 77, 88, 99, 100, d, *p; scanf( %d, /* 沒(méi)找到 */ ,4 指針與函數(shù),1.函數(shù)指針指向函數(shù)入口地址的指針。 定義方法 int (*f)(int x); (*f)(x)=f(x) main()char c20; doubl
8、e (*f)();int i; switch(c) case sin: f=sin;break; case cos:f=cos;break; case tan: f=tan;break; default:printf(“error”); for(i=0;i5;i+) printf(“%8.3f ”,(*f)(3.14*(i+1)/18);,4 指針與函數(shù),2.函數(shù)指針數(shù)組元素為函數(shù)指針數(shù)組。 定義方法 int (*f3)(int x); (*fi)(x)=fi(x) main()double (*f3)();int i; f0=sin; f1=cos; f2=tan; for(i=0;i3;i
9、+) printf(“%8.3f ”,(*fi)(3.14*(30)/180);,5 指針與二維數(shù)組,1.指針數(shù)組-數(shù)組中的每元素是指針變量。 指針數(shù)組定義: 類型標(biāo)識(shí) *數(shù)組名整型常量表達(dá)式; 例如:對(duì)a34, int *b3一指針數(shù)組 int (*a)4-指向一維數(shù)組指針; b0=a0=a; b1=a1=a+1; b2=a2=a+2; 兩者異同點(diǎn):1)定義不同; 2)*(bi+j)=aij; *(*(a+i)+j)=aij;,5 指針與二維數(shù)組,例7 a34 指針數(shù)組求法 main() int i,j,k,a34,*b3; for(i=0;i3;i+);bi=,2 多級(jí)指針,多級(jí)指針-指針
10、的指針。 int a10, *p=a, *q=p, *g=q; 一級(jí)指針二級(jí)指針三級(jí)指針 main()int i,j,k,; char *p=name; *q; char *name4=“ba”,”bc”,ca”,”abc”; for(i=0;i0) k=j; if (k!=i)q=*(p+k);*(p+k)= *(p+i); *(p+i)=q; for(i=0;i3;i+) printf(“%s ”,*(p+j);,例7. #include string.h main()char a380,*p3,*pp,*max;int i; for(i=0;i3;i+)pi=ai; for(i=0;i3
11、;i+)gets(pi); max=pp=,2 多級(jí)指針,5 指針與二維數(shù)組,C語(yǔ)言表示二維數(shù)據(jù)的方法有以下4種: 二維數(shù)組,如 int a34; 指針數(shù)組,如 int *pa3; 二級(jí)指針,如 int *p2; 指向一維數(shù)組的指針,如 int (*p1)4; 表示第i行第j列(i和j從0開(kāi)始取值)數(shù)據(jù)的基本表達(dá)式有以下4種: aij *(pai+j) *(*(p2+i)+j) (*(p1+i)j,5 指針與二維數(shù)組,1 二維數(shù)組指針p+p + int i,j,a34,*p=a;單指針 for(i=0; i10;i+) scanf(“%d”,p+); int i,j,a34,*p0=a0,*p
12、1=a1, *p2=a2; for(i=0;i4;i+)多指針 scanf(“%d%d%d”,p0+,p1+,p2+);,2 二維數(shù)組元素表示形式 p+p + a a00 a+1 a10a0+1 a01 位移8字節(jié)位移2字節(jié) p,int *b3一指針數(shù)組 int (*a)4-指向一維數(shù)組指針; *a=a0*a0=a00 *(a+1)=a1*a1+1=a01 *(a+2)=a2*a2=a02 例如 A12=(*(a+1)2 =*(a1+2) =*(*(a+1)+2) 證:a1=*(a+1) , a12=(*(a+1)2 a1+2=i3;i+); for(j=0;j4;j+); scanf(“%d
13、”,*(a+i)+j); printf(“%d”,*(*(a+i)+j);,例8 求a34的最大值及地址 main()int i,j,a34,max,r,c; for(i=0;i3;i+);for(j=0;j4;j+); scanf(“%d”,*(a+i)+j); max=a00;r=0;c=0; for(i=0;i3;i+);for(j=0;j4;j+); if(max*(*(a+i)+j) r=i;c=j; max= *(*(a+i)+j); printf(“%d %d %dn”,max,r,c);,6 指針與字符串,引進(jìn)指針數(shù)組? 方便處理長(zhǎng)度不等字串 字符指針cp: char *cp;
14、 于是可用: cp=a string; 若以Char name620 =“abc”,“bca” “cab”,“cba”,“bac”,“aaaaabbbbbcccccddddd”; 將造成存儲(chǔ)空間浪費(fèi)。 Char *name6=“abc”,“bca” “cab”,“cba” ,“bac”,“aaaaabbbbbcccccddddd”,6 指針與字符串,1.單字符串,6 指針與字符串,2.多字符串 1字符二維數(shù)組 char strs320 = Hello.,How are you?,Hi.; 2指針數(shù)組 基于二維數(shù)組 char *pa = strs0, strs1, strs2 ; 基于多個(gè)一維數(shù)
15、組 char str120 = Hello.; char str220 = How are you?; char str320 = Hi.; char *pa = str1, str2, str3;,6 指針與字符串, 基于字符串常量 char *pa = Hello.,How are you?,Hi.; 3二級(jí)指針 在指針數(shù)組的基礎(chǔ)上使用二級(jí)指針指向多字符串,如下char *p2 = pa; 4訪問(wèn)字符串 假設(shè)要訪問(wèn)第i個(gè)字符串,可以使用以下表達(dá)式: strsi pai p2i 如果要訪問(wèn)第i個(gè)字符串的第j個(gè)字符,則可用下式 strsij paij p2ij 以上為下標(biāo)表示法,同樣可以使用指
16、針?lè)ā?例9:打印1月至12月的月名month_name(n) 函數(shù)返回一指向包含第n月名字的字符指針: char *month_name(int n) static char *name= Illegal month, January,February, March, April, May, June,July, August, September, October,November, December ; return(n12)?name0:namen); main() int i; for(i=0; i13; i+) printf(%sn, month_name(i);,6 指針與字符串,命令
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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)目管理與評(píng)估手冊(cè)
- 2026年股市投資基礎(chǔ)知識(shí)模擬測(cè)試題
- 2026年網(wǎng)絡(luò)協(xié)議設(shè)計(jì)與性能優(yōu)化的面試經(jīng)驗(yàn)
- 2026年航空飛行員專業(yè)考試預(yù)測(cè)模擬題及答案
- 2026年教育心理學(xué)在中小學(xué)教育中的應(yīng)用模擬題
- 戰(zhàn)略布局溝通話術(shù)
- 公司解散清算專項(xiàng)法律服務(wù)服務(wù)保障方案
- 小學(xué)知識(shí)競(jìng)賽題庫(kù)及答案
- 小學(xué)面試題目及答案
- 2026年超臨界流體的熱力學(xué)特性
- 蘇州高新區(qū)(虎丘區(qū))市場(chǎng)監(jiān)督管理局公益性崗位招聘1人考試參考題庫(kù)及答案解析
- 2026年度新疆兵團(tuán)草湖項(xiàng)目區(qū)公安局招聘警務(wù)輔助人員工作(100人)考試參考題庫(kù)及答案解析
- LNG氣化站安裝工程施工設(shè)計(jì)方案
- 核酸口鼻采樣培訓(xùn)
- 企業(yè)安全隱患排查課件
- 環(huán)境監(jiān)測(cè)崗位職業(yè)技能考試題庫(kù)含答案
- 路燈基礎(chǔ)現(xiàn)澆混凝土檢驗(yàn)批質(zhì)量驗(yàn)收記錄
- 化學(xué)品作業(yè)場(chǎng)所安全警示標(biāo)志大全
- 礦卡司機(jī)安全教育考試卷(帶答案)
- 中建淺圓倉(cāng)漏斗模板支撐架安全專項(xiàng)施工方案
- 新能源材料與器件PPT完整全套教學(xué)課件
評(píng)論
0/150
提交評(píng)論