第10章指針ppt課件_第1頁
第10章指針ppt課件_第2頁
第10章指針ppt課件_第3頁
第10章指針ppt課件_第4頁
第10章指針ppt課件_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、2022-7-11第十章第十章 指針指針(Pointer) (Pointer) l指針的概念指針的概念l指針變量和指針運(yùn)算指針變量和指針運(yùn)算l指向數(shù)組的指針指向數(shù)組的指針l指向字符串的指針指向字符串的指針l指向函數(shù)的指針指向函數(shù)的指針l指針數(shù)組指針數(shù)組2022-7-12變量與地址程序中: short int i; float k; 內(nèi)存中每個(gè)字節(jié)有一個(gè)編號(hào)-地址.2000201920192019內(nèi)存02019ik 編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元變量是對程序中數(shù)據(jù)存儲(chǔ)空間的籠統(tǒng)2022-7-1310.1 地址和指針的概念地址和指針的概念指針變量和指針。指針變量和指針。內(nèi)存單元的地址與內(nèi)存單元的

2、內(nèi)容是不同內(nèi)存單元的地址與內(nèi)存單元的內(nèi)容是不同的。的。地址地址:內(nèi)存的每一個(gè)字節(jié)有一個(gè)編號(hào)內(nèi)存的每一個(gè)字節(jié)有一個(gè)編號(hào)指針變量指針變量:是保管內(nèi)存地址的變量,是保管內(nèi)存地址的變量,是變量的根本類型之一是變量的根本類型之一P37。指針指針:就是地址就是地址2022-7-14l運(yùn)用指針可以獲得緊湊、高效的代碼運(yùn)用指針可以獲得緊湊、高效的代碼l內(nèi)存的動(dòng)態(tài)分配、內(nèi)存地址的直接處置內(nèi)存的動(dòng)態(tài)分配、內(nèi)存地址的直接處置l指針與數(shù)組關(guān)系親密指針與數(shù)組關(guān)系親密l復(fù)雜數(shù)據(jù)構(gòu)造的簡約表達(dá)復(fù)雜數(shù)據(jù)構(gòu)造的簡約表達(dá)對指針的靈敏運(yùn)用,是對指針的靈敏運(yùn)用,是C的一個(gè)重要特征的一個(gè)重要特征l運(yùn)用指針也能夠使程序難懂運(yùn)用指針也能夠

3、使程序難懂l指針操作容易出錯(cuò)指針操作容易出錯(cuò)2022-7-15指針變量的聲明指針變量的聲明: 基類型基類型 *指針變量名指針變量名“* 指針運(yùn)算符指針運(yùn)算符間接運(yùn)算符間接運(yùn)算符,表示,表示指向指向 。如:如:int i, *i_pointer; i_pointer = &i; i=3; 10.2 變量的指針和指向變量的指針變量變量的指針和指向變量的指針變量 int *iPtr; iPtr是一個(gè)僅能指向整形變量的指針變量是一個(gè)僅能指向整形變量的指針變量float *fPtr; fPtr是一個(gè)僅能指向?qū)嵭巫兞康闹羔樧兞渴且粋€(gè)僅能指向?qū)嵭巫兞康闹羔樧兞?變量i&ii_pointer*

4、i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=3*i_pointer =3;2022-7-16指針變量.200020192019整型變量i10變量i_pointer20192000直接訪問與間接訪問直接訪問與間接訪問直接訪問:按變量地址存取變量值直接訪問:按變量地址存取變量值間接訪問:經(jīng)過存放變量地址的變量去訪問變量間接訪問:經(jīng)過存放變量地址的變量去訪問變量例 i=3; -直接訪問3例 *i_pointer=20; -間接訪問202022-7-17例 main( ) int i=10; int *p; *p=i; printf(“%d,*p

5、); 危險(xiǎn)!例 main( ) int i=10,k; int *p; p=&k; *p=i; printf(“%d,*p); 指針變量必需先賦值指針變量必需先賦值, ,再運(yùn)用再運(yùn)用.2000201920192019整型變量i10指針變量p201920192019隨機(jī)2022-7-18 1. 運(yùn)算符運(yùn)算符&:取地址運(yùn)算符:取地址運(yùn)算符 前往其操作數(shù)的地址,單目運(yùn)算符,前往其操作數(shù)的地址,單目運(yùn)算符, 操作數(shù)只能是變量。操作數(shù)只能是變量。 int y=5; int * yPtr; yPtr=&y; /*將整型變量將整型變量y的內(nèi)存地址賦給指針變量的內(nèi)存地址賦給指針變量yP

6、tr*/ 指針運(yùn)算符指針運(yùn)算符 2. 運(yùn)算符運(yùn)算符:間接訪問運(yùn)算符或指針運(yùn)算符:間接訪問運(yùn)算符或指針運(yùn)算符 前往其操作數(shù)前往其操作數(shù)(指針變量指針變量)所指所指 向?qū)ο蟮闹?,單目運(yùn)算符,向?qū)ο蟮闹?,單目運(yùn)算符,它的操作數(shù)只能是指針變量。它的操作數(shù)只能是指針變量。 printf(“%d, *yPtr); 輸出結(jié)果:52022-7-19 eg10.1 經(jīng)過指針變量訪問整型變量 #include void main() int a,b; int *pointer_1, *pointer_2; a=100;b=10; pointer_1=&a; pointer_2=&b; printf

7、(“%d,%dn,a,b); printf(“%d,%dn, *pointer_1, *pointer_2); 100,10 100,102022-7-110 eg10.1&a100&b*pointer_1*pointer_2abpointer_1pointer_2102022-7-111eg 10.2:輸入兩個(gè)整數(shù),按先大后小的順序輸出輸入兩個(gè)整數(shù),按先大后小的順序輸出 void main()int *p1,*p2,*p,a,b; scanf(“%d%d,&a,&b); p1=&a;p2=&b; if(ab) p=p1;p1=p2;p2=p;

8、printf(“na=%d,b=%dnn,a,b);printf(“max=%d,min=%dn,*p1,*p2);&a&b 5 9 a b p2 p1 p&b&a 5 9 a b p2 p1 p5 9a=5,b=9max=9,min=52022-7-112指針變量作為函數(shù)參數(shù)指針變量作為函數(shù)參數(shù) void main() int a,b;int *x,*y;scanf(%d,%d,&a,&b);x=&a; y=&b;if(ab) swap(x,y);printf(n%d, %dn,a,b);void swap(int *p1,in

9、t *p2)int temp;temp=*p1;*p1=*p2;*p2=temp;eg 10.3要求同eg 10.2&aa&b1441b&a&bxyp2p1相當(dāng)于兩個(gè)函數(shù)前往值相當(dāng)于兩個(gè)函數(shù)前往值2022-7-113#includevoid swap(int *p1,int *p2);void exchange(int *q1,int *q2,int *q3);void main()int *p1,*p2,*p3,a,b,c; scanf(%d,%d,%d,&a,&b,&c); p1=&a;p2=&b;p3=&c;

10、 exchange(p1,p2,p3); printf(n%d,%d,%dnn,a,b,c); void exchange(int *q1,int *q2,int *q3)if(*q1*q2) swap(q1,q2); if(*q1*q3) swap(q1,q3); if(*q2*q3) swap(q2,q3); void swap(int*p1,int*p2)int temp;temp=*p1;*p1=*p2;*p2=temp; t-eg10.4.cpp 輸入三個(gè)數(shù),按大小順序輸出傳送地址:數(shù)據(jù)傳送雙向傳送地址:數(shù)據(jù)傳送雙向2022-7-114小結(jié)小結(jié)一、函數(shù)傳送參數(shù)的方式一、函數(shù)傳送參數(shù)的

11、方式 1、傳值調(diào)用、傳值調(diào)用: 1調(diào)用函數(shù)將參數(shù)變量的值傳送給被調(diào)用函數(shù);調(diào)用函數(shù)將參數(shù)變量的值傳送給被調(diào)用函數(shù); 2被調(diào)用函數(shù)經(jīng)過被調(diào)用函數(shù)經(jīng)過retutn 語句將一個(gè)值前往給調(diào)用函數(shù)。語句將一個(gè)值前往給調(diào)用函數(shù)。2、傳地址調(diào)用、傳地址調(diào)用: 1調(diào)用函數(shù)將參數(shù)變量的地址傳送給被調(diào)用函數(shù);調(diào)用函數(shù)將參數(shù)變量的地址傳送給被調(diào)用函數(shù); 2被調(diào)用函數(shù)運(yùn)用指針運(yùn)算符被調(diào)用函數(shù)運(yùn)用指針運(yùn)算符* 來修正變量的值。來修正變量的值。二、傳地址調(diào)用的運(yùn)用方法二、傳地址調(diào)用的運(yùn)用方法 把地址作為參數(shù)的函數(shù)必需將函數(shù)的參數(shù)定義為指針把地址作為參數(shù)的函數(shù)必需將函數(shù)的參數(shù)定義為指針變量。變量。 2022-7-115 1

12、0.3數(shù)組與指針 一 指向數(shù)組元素的指針例 int array10; int *p; p=&array0; 或 int *p=&array0;或 int *p=array;數(shù)組名是表示數(shù)組首地址的地址常量array0array1array2array3array9.整型指針p&array0pp=array;2022-7-116二、經(jīng)過指針援用數(shù)組元素二、經(jīng)過指針援用數(shù)組元素 int a10; int *p=a; 1p+1 指向下一個(gè)元素,不是指向下一個(gè)元素,不是p的內(nèi)容加的內(nèi)容加1 0200 0201 錯(cuò)錯(cuò)2*(p+i)和和*(a+i)就是就是ai (p+i)代表代表p

13、+i*d 是是ai的地址的地址3指向數(shù)組的指針變量也可以帶下標(biāo)指向數(shù)組的指針變量也可以帶下標(biāo) pi與與*(p+i)等價(jià)等價(jià)援用數(shù)組元素有各種方法援用數(shù)組元素有各種方法 (1)下標(biāo)法下標(biāo)法ai (2)指針法指針法*(a+i)或或*(p+i)其中其中p=a;2022-7-117數(shù)組元素表示方法下標(biāo)法a0a1a2a3a9.aa+9a+1a+2地址元素a0a1a2a9地址元素a0a1a2a3a9.pp+9p+1p+2指針法*p*(p+1)*(p+2)*(p+9) 變址運(yùn)算符ai *(a+i)ai pi *(p+i) *(a+i)*a*(a+1)*(a+2)*(a+9)p0p1p2p9 eg10.5(三

14、種方法p231)2022-7-118須留意的問題須留意的問題1、 自加:在循環(huán)中利用自加:在循環(huán)中利用p+ 指向不同元素指向不同元素 數(shù)組名與指針變量的區(qū)別:數(shù)組名與指針變量的區(qū)別: 指針變量是變量指針變量是變量; 數(shù)組名是指針常量,數(shù)組名是指針常量, 不可改動(dòng)。不可改動(dòng)。 a+2 、初值:、初值:p=a;每一次循環(huán)開場前,該當(dāng)使指針初始化每一次循環(huán)開場前,該當(dāng)使指針初始化 eg10_63 、超界:假設(shè)不初始化會(huì)出現(xiàn)、超界:假設(shè)不初始化會(huì)出現(xiàn)p+指向數(shù)組之外。指向數(shù)組之外。2022-7-119 eg10.6.cpp #includevoid main()int *p,i,a10;p=a;for

15、(i=0;i10;i+)scanf(%d,p+);printf(n);for(i=0;i10;i+,p+)printf(%4d,*p);775729713789737710001004100810361024102010281032101610121040 p p p=a;2022-7-120 指針的運(yùn)算 指針變量的賦值運(yùn)算 p=&a; (將變量a地址p) p=array; (將數(shù)組array首地址p) p=&arrayi; (將數(shù)組元素地址p) p1=p2; (指針變量p2值p1) 不能把一個(gè)整數(shù)p,也不能把p的值整型變量如 int i, *p; p=1000; () i=p

16、; ()2022-7-121 指針的算術(shù)運(yùn)算: pi p id (i為整型數(shù),d為p指向的變量所占字節(jié)數(shù))例 p指向float數(shù),那么 p+1 p+1 4例 p指向int型數(shù)組,且p=&a0; 那么p+1 指向a1例 int a10; int *p=&a2; p+; *p=1; / a3=1;例 int a10; int *p1=&a2; int *p2=&a5; 那么:p2-p1=3;2022-7-122五、用數(shù)組名做函數(shù)實(shí)參五、用數(shù)組名做函數(shù)實(shí)參傳送數(shù)組的首地址傳送數(shù)組的首地址 數(shù)組名作為實(shí)參是數(shù)組首地址數(shù)組名作為實(shí)參是數(shù)組首地址 數(shù)組名作為形參是指針變量數(shù)

17、組名作為形參是指針變量 函數(shù)首部:函數(shù)首部:f(int x,int n) f(int *x,int n)是等價(jià)的是等價(jià)的p235 a =&a0 x=&x0 a1x1 void main() int a10,num; f(a,num);2022-7-123 a0a7 用循環(huán)處置,設(shè)兩個(gè)位置變量:i , j; i的初值為0,j的初值為n-1i=0, 1, 2 , (n-1)/2 j=n-1-ieg10.7.c:將數(shù)組中:將數(shù)組中n個(gè)整數(shù)按相反順序存放個(gè)整數(shù)按相反順序存放ij2022-7-124例 將數(shù)組a中的n個(gè)整數(shù)按相反順序存放 ij 3 7 9 11 0 6 7 5 4 20

18、1 2 3 4 5 6 7 8 9ijijijji11760594723實(shí)參與形參均用數(shù)組名void inv(int x, int n) int t,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; t=xi; xi=xj; xj=t; void main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(The array has been reverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n);m=42022-7-125例 將數(shù)組a中的n個(gè)整數(shù)按相反順序存

19、放 void inv(int *x, int n) int t,*p,*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; main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(The array has been reverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n);實(shí)參用數(shù)組名,形參用指針變量37911067542a0a1a2a3a4a5a6a7a8a9xp=x+ma數(shù)組60711594

20、723ijijijjiji2022-7-126例 將數(shù)組a中的n個(gè)整數(shù)按相反順序存放 void inv(int *x, int n) int t,*i,*j,*p,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) t=*i; *i=*j; *j=t; main() int i,a10,*p=a; for(i=0;i10;i+,p+) scanf(%d,p); p=a; inv(p,10); printf(The array has been reverted:n); for(p=a;pa+10;p+) printf(%d,*p);實(shí)參與形參均用指針

21、變量2022-7-127例 將數(shù)組a中的n個(gè)整數(shù)按相反順序存放 void inv(int x, int n) int t,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; t=xi; xi=xj; xj=t; main() int i,a10,*p=a; for(i=0;i10;i+,p+) scanf(%d,p); p=a; inv(p,10); printf(The array has been reverted:n); for(p=arr;parr+10;p+) printf(%d ,*p);實(shí)參用指針變量,形參用數(shù)組2022-7-128void sort(

22、int x, int n) int i, j, k, t; for (i=0; in-1; i+) k = i; for (j=i+1; jxk) k=j; if (k!=i) t=xi,xi=xk,xk=t; void main() int a10, *p, i; p = a; for (i=0; i10; i+) scanf(%d, p+); p = a; sort(p, 10); for (p=a,i=0; i10; i+) printf(%d, *p);p+;eg10.9 選擇法排序選擇法排序int *x,sort(a, 10);2022-7-12910.4 字符串與指針字符串與指針一

23、、字符串的表示方式一、字符串的表示方式1用字符數(shù)組存放一個(gè)字符串用字符數(shù)組存放一個(gè)字符串2用字符指針指向一個(gè)字符串用字符指針指向一個(gè)字符串 void main()char str_1 =“Hello,World!;printf(“%sn, str_1); void main()char *str_2=“Hello,World!;printf(“%sn,str_2);str_1字符指針初始化:把字符串首地址賦給str_2 char *str_2; str_2=“Hello,world!;2022-7-130 eg10.17 .c將字符串a(chǎn)復(fù)制到b #include void main()char

24、 a =I am a boy.,b20;int i;for(i=0;*(a+i)!=0;i+)*(b+i)=*(a+i);*(b+i)=0;printf(string a is:%sn,a);printf(string b is:);for(i=0;bi!=0;i+)printf(%c,bi);printf(n);2022-7-131#include void main()char a =I am a boy.,b20,*p1,*p2;int i;p1=a;p2=b;for(;*p1!=0;p1+,p2+)*p2=*p1;*p2=0;printf(string a is:%sn,a);prin

25、tf(string b is:);for(i=0;bi!=0;i+)printf(%c,bi);printf(n);eg.10.182022-7-132二、字符指針做函數(shù)參數(shù)二、字符指針做函數(shù)參數(shù) 將字符串從一個(gè)函數(shù)傳到另一個(gè)函數(shù),可以采將字符串從一個(gè)函數(shù)傳到另一個(gè)函數(shù),可以采用用“地址傳送地址傳送字符指針變量和數(shù)組名:字符指針變量和數(shù)組名:一樣:均可指向字符串的起始地址;一樣:均可指向字符串的起始地址;區(qū)別:字符指針變量可進(jìn)展自加自減,而數(shù)組名不行區(qū)別:字符指針變量可進(jìn)展自加自減,而數(shù)組名不行2022-7-133例 用函數(shù)調(diào)用實(shí)現(xiàn)字符串復(fù)制 eg 10.191用字符數(shù)組作 參數(shù)2用字符指針變

26、量 作參數(shù) aIamateaceh0r.fromfrom byuarasutndetotooet.0Iaaeceh0r.t.0mtavoid copy_string(char from,char to) int i=0; while(fromi!=0) toi=fromi;i+; toi=0;main() char a=I am a teacher.; char b=You are a student.; printf(string_a=%sn string_b=%sn,a,b); copy_string(a,b); printf(nstring_a=%snstring_b=%sn,a,b);

27、void copy_string(char *from,char *to) for(;*from!=0;from+,to+) *to=*from; *to=0;main() char from=I am a teacher.; char to=You are a student.; char *a=from, *b=to; printf(string_a=%snstring_b=%sn,a,b); copy_string(a,b); printf(nstring_a=%snstring_b=%sn,a,b);2022-7-134三 字符指針變量與字符數(shù)組的討論char *cp; 與 char str20;數(shù)組str由假設(shè)干元素組成,每個(gè)元素放一個(gè)字符;而cp中存放字符串首地址 char str20; str=“I love China!; () char *cp; cp=“I love China!; ()str是地址常量;cp是地址變量cp接受鍵入字符串時(shí),必需先開辟存儲(chǔ)空間例 char str10; scanf(“%s,str); ()而 char *cp; scanf(“%s, cp); ()改為: char *cp,str10; cp=str

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論