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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

3、使程序難懂l指針操作容易出錯指針操作容易出錯2022-7-15指針變量的聲明指針變量的聲明: 基類型基類型 *指針變量名指針變量名“* 指針運算符指針運算符間接運算符間接運算符,表示,表示指向指向 。如:如:int i, *i_pointer; i_pointer = &i; i=3; 10.2 變量的指針和指向變量的指針變量變量的指針和指向變量的指針變量 int *iPtr; iPtr是一個僅能指向整形變量的指針變量是一個僅能指向整形變量的指針變量float *fPtr; fPtr是一個僅能指向實形變量的指針變量是一個僅能指向實形變量的指針變量3變量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、); 危險!例 main( ) int i=10,k; int *p; p=&k; *p=i; printf(“%d,*p); 指針變量必需先賦值指針變量必需先賦值, ,再運用再運用.2000201920192019整型變量i10指針變量p201920192019隨機2022-7-18 1. 運算符運算符&:取地址運算符:取地址運算符 前往其操作數(shù)的地址,單目運算符,前往其操作數(shù)的地址,單目運算符, 操作數(shù)只能是變量。操作數(shù)只能是變量。 int y=5; int * yPtr; yPtr=&y; /*將整型變量將整型變量y的內存地址賦給指針變量的內存地址賦給指針變量yP

6、tr*/ 指針運算符指針運算符 2. 運算符運算符:間接訪問運算符或指針運算符:間接訪問運算符或指針運算符 前往其操作數(shù)前往其操作數(shù)(指針變量指針變量)所指所指 向對象的值,單目運算符,向對象的值,單目運算符,它的操作數(shù)只能是指針變量。它的操作數(shù)只能是指針變量。 printf(“%d, *yPtr); 輸出結果: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:輸入兩個整數(shù),按先大后小的順序輸出輸入兩個整數(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相當于兩個函數(shù)前往值相當于兩個函數(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 輸入三個數(shù),按大小順序輸出傳送地址:數(shù)據(jù)傳送雙向傳送地址:數(shù)據(jù)傳送雙向2022-7-114小結小結一、函數(shù)傳送參數(shù)的方式一、函數(shù)傳送參數(shù)的

11、方式 1、傳值調用、傳值調用: 1調用函數(shù)將參數(shù)變量的值傳送給被調用函數(shù);調用函數(shù)將參數(shù)變量的值傳送給被調用函數(shù); 2被調用函數(shù)經(jīng)過被調用函數(shù)經(jīng)過retutn 語句將一個值前往給調用函數(shù)。語句將一個值前往給調用函數(shù)。2、傳地址調用、傳地址調用: 1調用函數(shù)將參數(shù)變量的地址傳送給被調用函數(shù);調用函數(shù)將參數(shù)變量的地址傳送給被調用函數(shù); 2被調用函數(shù)運用指針運算符被調用函數(shù)運用指針運算符* 來修正變量的值。來修正變量的值。二、傳地址調用的運用方法二、傳地址調用的運用方法 把地址作為參數(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 指向下一個元素,不是指向下一個元素,不是p的內容加的內容加1 0200 0201 錯錯2*(p+i)和和*(a+i)就是就是ai (p+i)代表代表p

13、+i*d 是是ai的地址的地址3指向數(shù)組的指針變量也可以帶下標指向數(shù)組的指針變量也可以帶下標 pi與與*(p+i)等價等價援用數(shù)組元素有各種方法援用數(shù)組元素有各種方法 (1)下標法下標法ai (2)指針法指針法*(a+i)或或*(p+i)其中其中p=a;2022-7-117數(shù)組元素表示方法下標法a0a1a2a3a9.aa+9a+1a+2地址元素a0a1a2a9地址元素a0a1a2a3a9.pp+9p+1p+2指針法*p*(p+1)*(p+2)*(p+9) 變址運算符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ù)組名是指針常量, 不可改動。不可改動。 a+2 、初值:、初值:p=a;每一次循環(huán)開場前,該當使指針初始化每一次循環(huán)開場前,該當使指針初始化 eg10_63 、超界:假設不初始化會出現(xiàn)、超界:假設不初始化會出現(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 指針的運算 指針變量的賦值運算 p=&a; (將變量a地址p) p=array; (將數(shù)組array首地址p) p=&arrayi; (將數(shù)組元素地址p) p1=p2; (指針變量p2值p1) 不能把一個整數(shù)p,也不能把p的值整型變量如 int i, *p; p=1000; () i=p

16、; ()2022-7-121 指針的算術運算: 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ù)

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

18、1 2 3 4 5 6 7 8 9ijijijji11760594723實參與形參均用數(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個整數(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ù)組名,形參用指針變量37911067542a0a1a2a3a4a5a6a7a8a9xp=x+ma數(shù)組60711594

20、723ijijijjiji2022-7-126例 將數(shù)組a中的n個整數(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);實參與形參均用指針

21、變量2022-7-127例 將數(shù)組a中的n個整數(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ù)組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ù)組存放一個字符串用字符數(shù)組存放一個字符串2用字符指針指向一個字符串用字符指針指向一個字符串 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)復制到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ù) 將字符串從一個函數(shù)傳到另一個函數(shù),可以采將字符串從一個函數(shù)傳到另一個函數(shù),可以采用用“地址傳送地址傳送字符指針變量和數(shù)組名:字符指針變量和數(shù)組名:一樣:均可指向字符串的起始地址;一樣:均可指向字符串的起始地址;區(qū)別:字符指針變量可進展自加自減,而數(shù)組名不行區(qū)別:字符指針變量可進展自加自減,而數(shù)組名不行2022-7-133例 用函數(shù)調用實現(xiàn)字符串復制 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由假設干元素組成,每個元素放一個字符;而cp中存放字符串首地址 char str20; str=“I love China!; () char *cp; cp=“I love China!; ()str是地址常量;cp是地址變量cp接受鍵入字符串時,必需先開辟存儲空間例 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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論