版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
指針1第一頁,共62頁。內(nèi)容提要指針的概念;定義指向各種數(shù)據(jù)類型的指針;
指針做函數(shù)的參數(shù);
難點(diǎn):指針與數(shù)組應(yīng)用用字符數(shù)組存取字符串;使用字符串處理函數(shù)處理字符串;結(jié)構(gòu)體。2第二頁,共62頁。
第一節(jié)變量的地址和指針
第二節(jié)指針變量的定義和引用
第三節(jié)指針與數(shù)組
第四節(jié)指針與字符串第五節(jié)指針與結(jié)構(gòu)體
第六節(jié)指針與函數(shù)
練習(xí)題3第三頁,共62頁。第一節(jié)變量的地址和指針一、地址和指針二、訪問變量的方式三、指針變量4第四頁,共62頁。尋找保險箱密碼一個關(guān)于特工008尋找保險箱密碼的故事…關(guān)鍵點(diǎn)分析得到線索:0217單元的“虎跑號〞存放箱提示地址:1976單元找到目標(biāo):“龍井號〞存放箱取出內(nèi)容:9115第五頁,共62頁。尋找密碼的途徑分析密碼911存放在某個存放箱內(nèi),如果我們知道這個存放箱的名字,就能夠找到密碼如果不知道密碼所在的存放箱名字,知道該存放箱的地址也照樣能夠取出密碼如果存放箱的地址也不知道,但是有另外一個地方存放這個存放箱的地址,就能順藤摸瓜,間接找到密碼6第六頁,共62頁。密碼存放示意圖龍井號9111976虎跑號19760217名字虎跑號龍井號地址02171976內(nèi)容19769117第七頁,共62頁。利用指針模擬尋找保險箱密碼的過程獲取密碼的兩種方法intmain(void){ intkey=911;/*變量key存放密碼*/ int*addr;/*變量addr存放地址*/
addr=&key;/*將key的地址賦給addr*/ /*通過變量key輸出密碼值*/printf("Thekeyis:%d\n",key);/*通過變量key的地址來輸出密碼值*/ printf("IfIknowtheaddressofthekey,Ialsocangetit:%d\n",*addr);
return0;}Thekeyis:911IfIknowtheaddressofthekey,Ialsocangetit:911
8第八頁,共62頁。
地址和指針
內(nèi)存單元地址內(nèi)容變量intx=20,y=1,z=155;printf("%d",x;)直接訪問:通過變量名訪問間接訪問:通過另一個變量訪問把變量的地址放到另一變量中使用時先找到后者再從中取出前者的地址100020x10041y1008155z20001000p地址指針變量9第九頁,共62頁。地址在程序中所定義的變量,編譯系統(tǒng)會根據(jù)變量的類型,分配一定長度的存儲空間。內(nèi)存中每一個存儲單元的有唯一編號。如:
int
a
4個字節(jié)
floatb
4個字節(jié)62000
20042019
a
b
指針
指針就是地址地址和指針10第十頁,共62頁。
●直接訪問方式按變量的地址存取變量的值。
●
間接訪問方式按變量的地址的地址存取變量的值。訪問變量的方式20006pa(1000)a(2000)11第十一頁,共62頁?!裰羔樢粋€變量的地址稱為該變量的指針。如地址2000是變量a的指針?!裰羔樧兞咳绻幸粋€變量專門用來存放另一個變量的地址〔即指針〕,稱為指針變量。如pa是一個指針變量,pa中的值為指針。指針變量12第十二頁,共62頁。一、指針變量的定義二、指針變量的引用第二節(jié)
指針變量的定義和引用13第十三頁,共62頁。
數(shù)據(jù)類型說明符*標(biāo)識符;例如:
int*pt;定義指向整型變量的指針變量合法標(biāo)識符指針變量名第二節(jié)指針變量的定義和引用14第十四頁,共62頁。例如inta,b;
int*p1,*p2;
p1=&a;p2=&b;&ap1p2ab&b15第十五頁,共62頁。引用第二節(jié)指針變量的定義和引用●C語言中的指針運(yùn)算符&:取變量地址運(yùn)算符*:“指向〞運(yùn)算符或稱“間接訪問〞運(yùn)算符例如:&a變量a的地址*p指針變量p所指向的變量16第十六頁,共62頁。#include<stdio.h>voidmain(){inta,*pi;floatf,*pf;a=10;f=1.5;pi=&a;pf=&f;printf(“%d,%f\n〞,a,f);printf(“%d,%f\n〞,*pi,*pf);}例6.1指針變量的使用pipfaf&a&f1017第十七頁,共62頁。#include<stdio.h>voidmain(){inta,b,*p,*p1,*p2;a=3;b=6;p1=&a;p2=&b;p=p1;p1=p2;p2=p;printf("%d%d\n",*p1,*p2);printf("%d%d\n",a,b);}單擊鼠標(biāo),演示程序的執(zhí)行過程:p1p2pab&a&b63&a&b&a例6.2交換指針的指向18第十八頁,共62頁。#include<stdio.h>voidmain(){inta,b,temp,*p1,*p2;a=3;b=6;p1=&a;p2=&b;temp=*p1;*p1=*p2;*p2=temp;printf("%d%d\n",a,b);}p1p2tempab&a&b63例6.3交換指針指向的變量值63319第十九頁,共62頁。
一、指向一維數(shù)組的指針變量二、*指向二維數(shù)組的指針變量第三節(jié)指針與數(shù)組20第二十頁,共62頁?!穸x
inta[5];
int*p;
p=&a[0];或p=a;●說明
指針的類型必須同于數(shù)組元素的類型定義指針的同時賦予數(shù)組的首地址。例如:inta[8];
int*p=a;指向一維數(shù)組的指針變量a[0]a[1]a[2]a[3]a[4]p2000a[0]a[1]a[2]a[3]a[4]21第二十一頁,共62頁。通過指針變量來引用一維數(shù)組的元素例如:inta[8],i;
int*p=a;●下標(biāo)法:用a[i]來引用數(shù)組a的第i個數(shù)組元素,●指針法:用*(a+i),*(p+i)引用數(shù)組的第i個數(shù)組元素。22第二十二頁,共62頁。#include<stdio.h>voidmain(){inta[10],*p,i;for(i=0;i<10;i++)a[i]=i;for(p=a;p<(a+10);p++)printf("%d",*p);}例
數(shù)組元素的引用#include<stdio.h>voidmain(){inta[10],i;for(i=0;i<10;i++)a[i]=i;for(i=0;i<10;i++)printf("%d",a[i]);
*(a+i);
}23第二十三頁,共62頁。p++使指針p指向數(shù)組的下一個元素。*p++等價于*〔p++〕,其作用是先得到p指向變量的值〔即*p〕,然后再使p+1賦給p。*〔p++〕與*〔++p〕的作用不同。前者是先取*p的值,然后使指針變量p加1;后者是先使指針變量p的值加1,再取*p。p+n只是地址變化,指針沒有移動。
指針運(yùn)算24第二十四頁,共62頁。#include<stdio.h>voidmain(){intx[]={1,2,3,4,5,6,7,8,9,0};int*p=x;printf(“%d\t〞,*p++);printf(“%d\t〞,*(p+8));printf(“%d\n〞,*--p);}練習(xí)10125第二十五頁,共62頁。
用指針變量來作為函數(shù)的參數(shù),根據(jù)形式參數(shù)和實(shí)際參數(shù)的用法可以有以下4種形式:實(shí)際參數(shù):數(shù)組名指針變量形式參數(shù):數(shù)組名指針變量指針變量作為函數(shù)的參數(shù)26第二十六頁,共62頁。#include<stdio.h>voidmain(){inta[10]={1,3,5,7,9,11,13,15,17,19};inti,*p;voidinvert(int*p,intn);p=a;printf(“數(shù)組交換前的順序?yàn)椋篭n〞);for(i=0;i<10;i++)printf(“%5d〞,a[i]);invert(p,10);printf(“\n數(shù)組交換后的順序?yàn)椋篭n〞);for(i=0;i<10;i++)printf(“%5d〞,a[i]);}例6.7將數(shù)組中的n個數(shù)逆序存放指針當(dāng)實(shí)參27第二十七頁,共62頁。voidinvert(int*p,intn){inti,*q,temp;q=p+n-1;for(i=0;i<n/2;i++){temp=*p;*p=*q;*q=temp;p++;q--;}}函數(shù)定義28第二十八頁,共62頁。一、字符串的表示形式二、指向字符串指針變量的應(yīng)用第四節(jié)指針與字符串29第二十九頁,共62頁。●兩種方法用字符數(shù)組實(shí)現(xiàn)例如:charstr[]=“Clanguage〞;用字符指針實(shí)現(xiàn)例如:char*pstr=“Clanguage〞;或char*pstr;pstr=“Clanguage〞;字符串的表示形式30第三十頁,共62頁。#include<stdio.h>voidmain(){intstrlenth(char*p);charstr[80];inti,len;char*p;gets(str);p=str;len=strlenth(p);printf(“%5d〞,len);}
例6.8寫一函數(shù),求一個字符串的長度(c68.cpp)intstrlenth(char*p){intlen=0;while(*p!=‘\0’){len=len+1;p++;}return(len);}
31第三十一頁,共62頁。#include<stdio.h>voidmain(){charst[20],*pc;pc=st;scanf(“%s〞,pc);printf(“%s\n〞,pc);}指向字符串指針變量的應(yīng)用pc3000例6.9輸入一字符串并輸出,用字符指針變量來實(shí)現(xiàn)。st[0]st[1]st[18]…..w\0…!e32第三十二頁,共62頁。#include<stdio.h>voidmain(){chara[80],b[80],*pa,*pb;pa=a;pb=b;gets(pa);while(*pa!=’\0’){*pb=*pa;pa++;pb++;}*pb=’\0’;printf(“%s〞,b);}例6.10將字符串a(chǎn)復(fù)制到字符串b。\0wel…\0papba[0]b[0]33第三十三頁,共62頁。#include<stdio.h>voidmain(){char*s1="Clanguage";s1+=2;printf("%s\n",s1);}
例6.11輸出字符串中的局部數(shù)據(jù)運(yùn)行結(jié)果language34第三十四頁,共62頁。#include“stdio.h〞voidmain(){voiddel_ch(char*p,charch);charstr[80],*pt,ch;printf(“plsenterastr:\n〞);gets(str);pt=str;printf(“plsenterthechardeleted:\n〞);ch=getchar();del_ch(pt,ch〕;printf(“thenewstirngis:\n%s\n〞,str);}例6.12有一行字符,要求刪去指定的字符。例如:“Hehas350$.〞如果刪去“0〞,那么變?yōu)椤癏ehas35$〞。35第三十五頁,共62頁。voiddel_ch(char*p,charch){char*q=p;for(;*p!=‘\0’;p++)if(*p!=ch){*q=*p;q++;}*q=‘\0’;}welcome\0pqqpp36第三十六頁,共62頁。指向結(jié)構(gòu)體變量的指針定義了一個structstud類型,可用下面形式定義一個指向這種類型數(shù)據(jù)的指針變量:
structstud*p;用指針變量p可以指向任一個屬于structstud類型的結(jié)構(gòu)體變量。第五節(jié)指針與結(jié)構(gòu)體37第三十七頁,共62頁。例6.12-1定義指向結(jié)構(gòu)體的指針變量#include"stdio.h"#include"string.h"structstud{longnum;charname[20];chargender;intage;floatscore;};
38第三十八頁,共62頁。voidmain(){
structstudstudent1;structstud*p;p=&student1;student1.num=970101;strcpy(,"LiuLi");student1.gender='M';student1.age=16;student1.score=95.5;
39第三十九頁,共62頁。printf("No:%ld\nname:%s\ngender:%c\nage:%d\nscore:%6.2f\n",student1.num,,student1.gender,student1.age,student1.score);printf("\nNo:%ld\nname:%s\ngender:%c\nage:%d\nscore:%6.2f\n",(*p).num,〔*p).name,(*p).gender,(*p).age,(*p).score);}40第四十頁,共62頁。程序運(yùn)行結(jié)果如下:No:970101name:LiuLigender:Mage:16No:970101name:LiuLigender:Mage:1641第四十一頁,共62頁。說明(*p).nump->num等價“->〞運(yùn)算符的優(yōu)先級別最高。42第四十二頁,共62頁。
一、指針作函數(shù)的參數(shù)二、函數(shù)返回指針三、函數(shù)指針第六節(jié)指針與函數(shù)43第四十三頁,共62頁。指針變量存放的是地址值,同樣可以作為函數(shù)的參數(shù)來進(jìn)行“地址傳送〞?!駥?shí)際參數(shù)為地址常量或指針變量●形式參數(shù)為指針變量。指針作函數(shù)的參數(shù)44第四十四頁,共62頁。
voidmain(){inta,b,max;int*pa,*pb;printf("輸入a和b:\n");scanf("%d,%d",&a,&b);pa=&a;pb=&b;if(a<b)swap(pa,pb);
printf("max=%d\n",a);}#include<stdio.h>voidswap(int*p1,int*p2)
{inttemp;temp=*p1;*p1=*p2;*p2=temp;}例6.13用函數(shù)來實(shí)現(xiàn)求兩數(shù)中的大者45第四十五頁,共62頁。swap()能否寫成下面這種形式呢?
swap(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}
??46第四十六頁,共62頁。函數(shù)返回指針
定義形式類型說明符*函數(shù)名(參數(shù)表){函數(shù)體}
例如:int*search(int*x,intn){int*p;p=x+n;return(p);}
47第四十七頁,共62頁。例6.14對例的功能用返回指針的函數(shù)來實(shí)現(xiàn)
#include<stdio.h>int*max(int*p1,int*p2){int*r;if(*p1>*p2)r=p1;elser=p2;returnr;}intmain(){inta,b;int*p;printf("輸入a和b:\n");scanf("%d,%d",&a,&b);p=max(&a,&b);printf("max=%d",*p);return0;}48第四十八頁,共62頁。例6.15解密藏頭詩#include<stdio.h>intmain(){char*change(chars[][20],chart[]);inti;chars[4][20],t[10],*p;printf("請輸入詩:\n");for(i=0;i<4;i++) scanf("%s",s[i]);
p=change(s,t); printf("解密:\n"); printf("%s\n",p); return0;}
char*change(chars[][20],chart[]){inti;for(i=0;i<4;i++) {t[2*i]=s[i][0]; t[2*i+1]=s[i][1];}t[2*i]='\0';
returnt;}一葉輕舟向東流帆梢輕握楊柳手風(fēng)纖碧波微起舞順?biāo)螐难趴陀?9第四十九頁,共62頁?!褚粋€函數(shù)在內(nèi)存中占一片存儲空間。在函數(shù)被編譯時,被分配給一個入口地址,這個入口地址就稱為函數(shù)的指針?!裼靡粋€指針變量指向函數(shù),然后用指向函數(shù)的指針變量代替函數(shù)名來調(diào)用這個函數(shù)。函數(shù)指針50第五十頁,共62頁。●形式:類型說明符(*指針變量名)(參數(shù)表);例如:int(*p)(int,int);表示定義了一個指向函數(shù)的指針變量p,函數(shù)的返回值是整型。●函數(shù)的調(diào)用形式〔*指針變量〕〔實(shí)參表列);例如:(*p)(a,b);
注意!與int*p()的區(qū)別函數(shù)指針的定義m=(*p)(a,b);m=min(a,b);51第五十一頁,共62頁。練習(xí)題1.有以下程序#include<stdio.h>voidmain(){ char*s={“ABC〞}; do {printf(“%d〞,*s%10);s++; }while(*s);}A)5670B)656667C)567D)ABCC52第五十二頁,共62頁。2.有以下程序#include<stdio.h>voidfun(char*s){ while(*s) { if(*s%2==0)printf(“%c〞,*s); s++; }}voidmain(){ chara[]={“good〞}; fun(a); printf(“\n〞);}注意:字母a的ASCII碼值為97,程序運(yùn)行后的輸出結(jié)果是A)dB)goC)godD)goodA53第五十三頁,共62頁。3.#include<stdio.h>voidfun(int*a,int*b){ int*c; c=a;a=b;b=c;}voidmain(){ intx=3,y=5,*p=&x,*q=&y; fun(p,q);printf(“%d,%d,〞,*p,*q); fun(&x,&y);printf(“%d,%d\n〞,*p,*q);}程序運(yùn)行后的輸出結(jié)果是A)3,5,5,3B)3,5,3,5C)5,3,3,5D)5,3,5,3B54第五十四頁,共62頁。4.有以下程序#include<stdio.h>intb=2;intfun(int*k){b=*k+b;return(b);}voidmain(){ inta[10]={1,2,3,4,5,6,7,8},i; for(i=2;i<4;i++){b=fun(&a[i])+b;printf(“%d〞,b);} printf(“\n〞);}程序運(yùn)行后的輸出結(jié)果是A)1012B)810C)1028D)1016C55第五十五頁,共62頁。5.寫出程序運(yùn)行結(jié)果#include<stdio.h>voidp(int*x,inty){++*x;y--;}voidmain(){intx=0,y=3;p(&x,y);printf("%d,%d",x,y);}1,356第五十六頁,共62頁。6.寫出程序運(yùn)行結(jié)果#include<stdio.h>#include<string.h>voidmain(){chara[]=“Language〞,b[20];char*p1,*p2;intk,n;n=strlen(a);p1=a+n-1;p2=b;for(k=0;k<n;k++){*p
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年繁華商圈店鋪?zhàn)赓U合同3篇
- 2024年跨國保險業(yè)務(wù)分銷合同
- 2024年版:項(xiàng)目合作風(fēng)險共擔(dān)協(xié)議
- 2024黃山旅游紀(jì)念品設(shè)計(jì)合同
- 2025年度大理石石材進(jìn)出口貿(mào)易承包合同規(guī)范3篇
- 2024藝術(shù)品代理銷售與藝術(shù)品展覽策劃合同3篇
- 2024蔬菜產(chǎn)地直供與電商平臺合作意向協(xié)議書3篇
- 2025年度物業(yè)費(fèi)收取與調(diào)整協(xié)議3篇
- 2024甲乙雙方共建智慧城市戰(zhàn)略合作合同
- 西南大學(xué)《特殊兒童運(yùn)動康復(fù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 鼓脹教學(xué)查房
- 2023年項(xiàng)目申報專員年終總結(jié)及年后展望
- 普通高中思想政治課程標(biāo)準(zhǔn)
- 假發(fā)項(xiàng)目市場營銷與品牌管理方案
- 1-6年級健康教育課程安排表
- 《石墨類負(fù)極材料檢測方法 第1部分:石墨化度的測定》
- 紅色經(jīng)典影片與近現(xiàn)代中國發(fā)展期末考試答案
- 建設(shè)工程設(shè)計(jì)文件質(zhì)量檢查報告范例
- 施工圖審查要點(diǎn)-全專業(yè)
- 千字文毛筆楷書描紅字帖-米字格A4版
- 男人來自火星女人來自金星
評論
0/150
提交評論