C程序設(shè)計課件:C指針_第1頁
C程序設(shè)計課件:C指針_第2頁
C程序設(shè)計課件:C指針_第3頁
C程序設(shè)計課件:C指針_第4頁
C程序設(shè)計課件:C指針_第5頁
已閱讀5頁,還剩36頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 指 針C+程序設(shè)計中使用指針可以:使程序簡潔、緊湊、高效有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)動態(tài)分配內(nèi)存得到多于一個的函數(shù)返回值程序中: int i; float k; 內(nèi)存中每個字節(jié)有一個編號-地址.2000200120022005內(nèi)存02003 i k 編譯或函數(shù)調(diào)用時為其分配內(nèi)存單元變量是對程序中數(shù)據(jù)存儲空間的抽象1. 變量與地址一. 指針的基本概念.2000200420062005整型變量i10變量i_pointer200120022003指針:一個變量的地址,它是一個整數(shù)形式的常量。指針變量:專門用來存放地址的變量叫指針變量,它的值也可以是數(shù)組或函數(shù)的地址 。2000指針指針變量 變量的內(nèi)容

2、變量的地址2. 指針與指針變量含義: 取變量的地址單目運(yùn)算符結(jié)合性:自右向左含義: 從某個地址中獲取數(shù)據(jù)單目運(yùn)算符結(jié)合性:自右向左兩者關(guān)系:互為逆運(yùn)算3. 取地址運(yùn)算符&與指針運(yùn)算符*.2000200420062005整型變量i10變量i_pointer2001200220032000指針變量i_pointer-指針變量,它的內(nèi)容是地址量2000*i_pointer-指針的目標(biāo)變量i,它的內(nèi)容是數(shù)據(jù)10&i_pointer-指針變量占用內(nèi)存的地址:2004i_pointer &i &(*i_pointer)i *i_pointer *(&i)指針運(yùn)算符示例=例 i=3; -直接訪問指針變量.2

3、000200420062005整型變量i10變量i_pointer20012002200320003例 *i_pointer=20; -間接訪問20直接訪問:按變量地址存取變量值間接訪問:通過存放變量地址的變量去訪問變量4. 直接訪問與間接訪問1. 指針變量與其所指向的變量之間的關(guān)系2. 指針變量的定義一般形式: 存儲類型 數(shù)據(jù)類型 *指針名;3變量i2000i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=3合法標(biāo)識符指針變量本身的存儲類型指針的目標(biāo)變量的數(shù)據(jù)類型表示定義指針變量不是乘法運(yùn)算符*例 int *p1,*p2; flo

4、at *q ; static char *name;注意:1、int *p1, *p2; 與 int *p1, p2;不一樣。2、指針變量名是p1,p2 ,不是*p1,*p2。3、指針變量只能指向定義時所規(guī)定類型的變量。4、指針變量定義后,變量值不確定,應(yīng)用前必須先賦值。二. 指針變量的定義與引用將地址值賦給指針變量例 int i; int *p=&i;變量必須已說明過;并要求兩者類型一致。例 int *p=&i; int i;例 int i; int *p=&i; int *q=p;用已初始化指針變量作初值例 main( ) int i; static int *p=&i; () . 不能用

5、auto變量的地址去初始化static型指針一般形式:存儲類型 數(shù)據(jù)類型 *指針名=初始地址值;3.對指針變量的操作(1) 指針變量的初始化3.對指針變量的操作(續(xù))(2) 指針變量 +/- 整數(shù)新的地址int a,b,c,d,*p,*q; p=&b;q=p+1; .20002008200A200220042006200C200E2010.59整型變量a 整型變量b 整型變量c 整型變量d202259 指針變量p 指針變量q20022004所加的數(shù)值:整數(shù)*字節(jié)數(shù) q=p-1; p+; +p; 注意:*p+; *+p; 不同于 (*p)+; + (*p);(3) 指針變量 - 指針變量 整數(shù)(

6、多少個數(shù)) q-p 1;(4) 關(guān)系運(yùn)算 pq 1; p=q 0;例 main( ) int i=10; int *p; *p=i; cout*p; 危險!例 main( ) int i=10,k; int *p; p=&k; *p=i; cout*p; .2000200420062005整型變量i10指針變量p200120022003隨機(jī)值4. 指針變量必須先賦值,再使用!零指針與空類型指針零指針:(空指針)定義:指針變量值為零 例如: int * p=0; p指向地址為0的內(nèi)存單元;系統(tǒng)保證該單元不作它用;表示指針變量的值沒有意義。#define NULL 0int *p=NULL;p=N

7、ULL與未對p賦值不同用途: 避免指針變量的非法引用在程序中常作為狀態(tài)比較 例 int *p; . while(p!=NULL) . 5. 零指針一般形式: void *類型指針;例如: void *p; 表示不指定p是指向哪一種類型數(shù)據(jù)的指針變量。使用時要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。6. 空類型指針例 char *p1; void *p2; p1=(char *)p2; p2=(void *)p1;TC中分配內(nèi)存空間的函數(shù)返回一個空類型的指針。 void *malloc(int n); 例如:int *p= (int *) malloc(2);main() int *p1,*p2,*p,a,b; a=

8、5;b=9; p1=&a; p2=&b; if(ab) p=p1; p1=p2; p2=p; coutab; coutmax=min=*p1*p2;運(yùn)行結(jié)果:5,9a=5,b=9max=9,min=5.指針變量p1 指針變量p20002010200220042008 指針變量p2 整型變量b 整型變量a5200892010200820102008例 按先大后小的順序輸出a和b兩個整數(shù)。 7. 多重指針 一個指針變量的內(nèi)容就是內(nèi)存中某個存儲區(qū)域的地址,這個存儲區(qū)域中存放的值可以是一個基本數(shù)據(jù)類型的數(shù)據(jù),也可以是另一個存儲區(qū)域的地址。我們把這種類型的指針叫做多重指針。二重指針(指向指針的指針)的一

9、般說明形式為: 類型說明符 *指針變量名;二重指針的使用。main() int *p1, *p2, i = 10; p1=&i; p2=&p1; void swap(int x,int y) int temp; temp=x; x=y; y=temp;void main() int a=10,b=20; if(ab) swap(a,b); coutab;.20002008200A20022004200610變量a 變量b(main)20 變量temp 變量y 變量x(swap)1010201020COPY值傳遞運(yùn)行結(jié)果:10, 20不能達(dá)到預(yù)期的結(jié)果!8. 函數(shù)之間地址值的傳遞1. 形參為指針

10、變量:傳遞的是指針變量的值-地址。 特點:共享內(nèi)存, 相當(dāng)于“雙向”傳遞!例 將數(shù)從大到小輸出(用變量作函數(shù)的參數(shù))void swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; int *pointer_1,*pointer_2; a=5; b=9; pointer_1=&a; pointer_2=&b; if(ab)swap(pointer_1,pointer_2); coutab;.20002008200A200220042006200C200E2010.59整型變量a 整型變量b(main)指針point

11、er_1指針pointer_220002002(swap)指針p1指針p2整型p5920002002COPY5例 將數(shù)從大到小輸出(用指針作函數(shù)的參數(shù))void swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; int *pointer_1,*pointer_2; a=5; b=9; pointer_1=&a; pointer_2=&b; if(ab)swap(pointer_1,pointer_2); coutab;.20002008200A200220042006200C200E2010.59整型變量a

12、整型變量b(main)指針pointer_1指針pointer_22000200259運(yùn)行結(jié)果:9,5地址值傳遞例 將數(shù)從大到小輸出(用指針作函數(shù)的參數(shù))續(xù)void swap(int *p1, int *p2) int *p; *p=*p1; *p1=*p2; *p2=*p;main() int a,b; int *pointer_1,*pointer_2; a=5; b=9; pointer_1=&a; pointer_2=&b; if(ab) swap(pointer_1,pointer_2); coutaab; pointer_1=&a; pointer_2=&b; if(ab) swa

13、p(*pointer_1,*pointer_2); coutaab; pointer_1=&a; pointer_2=&b; if(ab) swap(pointer_1,pointer_2); coutab;.20002008200A200220042006200C200E2010.59整型a 整型b(main)pointer_1pointer_22000200220002002COPY(swap)指針p1指針p2指針p*2000地址傳遞20002002運(yùn)行結(jié)果:5,9也不能達(dá)到預(yù)期的結(jié)果!例 錯誤程序之三array0array1array2array3array9.整型指針p&array0p

14、數(shù)組名是表示數(shù)組首地址的地址常量!三. 數(shù)組和指針 一維數(shù)組和數(shù)組元素的地址一個整數(shù)在內(nèi)存中占兩個連續(xù)的存儲單元,排在前面的那個存儲單元的地址就是這個整數(shù)的地址;長整數(shù)、實數(shù)數(shù)組元素的地址同上。數(shù)組中的若干個數(shù)組元素在內(nèi)存中是依次連續(xù)存放的,占一片連續(xù)的內(nèi)存單元,其中排在前面的那個數(shù)組元素的地址就是這個數(shù)組的地址。 例 數(shù)組以及各個數(shù)組元素在內(nèi)存中的地址 void main()int i, a10;cout index, Address, size:n ;for( i = 0; i 10; i+ )cout &a i , &ai sizeof( ai)endl ; cout Address o

15、f a =aendl;cout size of a =sizeof(a)endl; 程序運(yùn)行結(jié)果如下(VC): index, Address, size:&a 0 , 0 x12ff54, 4&a 1 , 0 x12ff58, 4&a 2 , 0 x12ff5c, 4&a 3 , 0 x12ff60, 4&a 4 , 0 x12ff64, 4&a 5 , 0 x12ff68, 4&a 6 , 0 x12ff6c, 4&a 7 , 0 x12ff70, 4&a 8 , 0 x12ff74, 4&a 9 , 0 x12ff78, 4Address of a = 0 x12ff54size of a

16、 = 40 在C+語言中,一維數(shù)組的任何一個元素的地址,都可以用其數(shù)組名加上一個偏移量來表示。 即: &aia+i *&ai ai*(a+i)a0a1a2a3a9.aa+9a+1a+2地址元素下標(biāo)法a0a1a2a9a0a1a2a3a9.pp+9p+1p+2地址元素指針法*p*(p+1)*(p+2)*(p+9)ai pi *(p+i) *(a+i)*a*(a+1)*(a+2)*(a+9)p0p1p2p92. 通過指針引用數(shù)組元素 int a10,*p=&a0;a=a+1; a+;p=p+1; p+; a0a1a2a3a4void main()int a5,*pa,i;for(i=0;i5;i+)

17、ai=i+1;pa=a;for(i=0;i5;i+) cout*(pa+i):*(pa+i)endl;for(i=0;i5;i+) cout*(a+i):*(a+i)endl;for(i=0;i5;i+) coutpai:paiendl;for(i=0;i5;i+) coutai:aiendl; 12345pa例 數(shù)組元素的引用方法數(shù)組名作函數(shù)參數(shù),實參與形參的對應(yīng)關(guān)系實參形參數(shù)組名指針變量數(shù)組名指針變量數(shù)組名數(shù)組名指針變量指針變量3. 數(shù)組名或指針作形參 ij 3 7 9 11 0 6 7 5 4 20 1 2 3 4 5 6 7 8 9ijijijji11760594723void inv

18、(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=3,7,9,11,0,6,7,5,4,2; inv(a,10); coutThe array has been reverted:n; for(i=0;i10;i+) coutai; coutendl;m=4例 將數(shù)組a中的n個整數(shù)按相反順序存放1. 實參與形參均用數(shù)組例 將數(shù)組a中的n個整數(shù)按相反順序存放 void inv(int *x, int n) int t,*p,*i,*j,m=(n-1)/2

19、; 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); coutThe array has been reverted:n; for(i=0;i10;i+) coutai; coutendl;2. 實參用數(shù)組,形參用指針變量例 將數(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

20、=*i; *i=*j; *j=t; main() int i,a10,*p=a; for(i=0;i*p; p=a; inv(p,10); coutThe array has been reverted:n; for(p=a;pa+10;p+) cout*p;3. 實參與形參均用指針變量例 將數(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;i*p; p=a; inv(p,1

21、0); coutThe array has been reverted:n; for(p=arr;parr+10;p+) cout*p;4. 實參用指針變量,形參用數(shù)組a+i=ai=*(a+i) =&ai0, 值相等,含義不同a+i 表示第i行首地址,指向行ai *(a+i) &ai0,表示第i行第0列元素地址,指向列a0a1a2200020082016200020022008201020162018a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2對二維數(shù)組 int a34,有a-二維數(shù)組的首地址,即第0行的首地址a+i-第i行的首地址ai *(a+i)-

22、第i行第0列的元素地址ai+j *(a+i)+j -第i行第j列的元素地址*(ai+j) *(*(a+i)+j) aij5 指針與二維數(shù)組 1. 二維數(shù)組和數(shù)組元素的地址 表示形式含義地址a二維數(shù)組名,數(shù)組首地址a0,*(a+0),*a第0行第0列元素地址a+1第1行首地址a1,*(a+1)第1行第0列元素地址a1+2,*(a+1)+2,&a12第1行第2列元素地址*(a1+2),*(*(a+1)+2),a12第1行第2列元素值2000200020082008201213例 3個學(xué)生各學(xué)4門課,計算總平均分,并輸出第n個學(xué)生成績main() void average(float *p,int

23、n); void search(float (*p)4,int n); float score34=65,67,79,60,80,87,90,81,90,99,100,98; average(*score,12); search(score,2);void average(float *p,int n) float *p_end, sum=0,aver; p_end=p+n-1; for(;p=p_end;p+)sum=sum+(*p); aver=sum/n; coutaverage=“aver;void search(float (*p)4, int n) int i; cout No:“

24、n; for(i=0;i4;i+) cout*(*(p+n)+i);列指針行指針函數(shù)說明float p46552796080879081909910098pp*(*(p+n)+i) pni例 3個學(xué)生各學(xué)4門課,計算總平均分,并查找一門以上課 不及格學(xué)生, 輸出其各門課成績void search(float (*p)4, int n) int i,j,flag; for(j=0;jn;j+) flag=0;for(i=0;i4;i+) if(*(*(p+j)+i)60) flag=1;if(flag=1) printf(No.%d is fail,his scores are:n,j+1);

25、for(i=0;i4;i+)printf(%5.1f ,*(*(p+j)+i); printf(n); main() void search(float (*p)4, int n); float score34=.,.,.; search(score,3);6552796080879081909910098p*(*(p+j)+i) pji例 main( ) char string=“I love China!”; coutstringendl; coutstring+7; IloveChistring0string1string2string3string4string5string6stri

26、ng7string8string9stringstring10string11string12string13n!a01. 字符串表示形式(1) 用字符數(shù)組實現(xiàn)五 指針與字符串例 main( ) char *string=I love China!; coutstringendl; string+=7; while(*string) putchar(string0); string+; IloveChistringn!a0字符指針初始化:把字符串首地址賦給string相當(dāng)于以下兩個語句: char *string; string=I love China!;string*string!=0(2

27、) 用字符指針實現(xiàn)*string例 字符串復(fù)制(1)用字符數(shù)組 作參數(shù)void 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.; coutstring_a=a string_b=b; copy_string(a,b); coutstring_a=a string_b=b;2. 用指向字符串的指針作函數(shù)參數(shù)例 實現(xiàn)字符串復(fù)制void copy_string(char *from,char *to) for(;*from!=0;from+,to+) *to=*from; *to=0;void main() char *a=I am a teacher.123456789; char b80=You are a student.; coutstring_a=aendl;cout string_b=bendl; copy_string(a,b); cou

溫馨提示

  • 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/150

提交評論