譚浩強教授著、清華大學出版社出版的《C程序設計》 (3)_第1頁
譚浩強教授著、清華大學出版社出版的《C程序設計》 (3)_第2頁
譚浩強教授著、清華大學出版社出版的《C程序設計》 (3)_第3頁
譚浩強教授著、清華大學出版社出版的《C程序設計》 (3)_第4頁
譚浩強教授著、清華大學出版社出版的《C程序設計》 (3)_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第八章指針,交實驗報告168頁1題格式:按照上機指導書171頁附錄D格式書寫采用統(tǒng)一的實驗報告紙,預備知識,內存:就是內部存儲器,是由存儲單元組成的。它的特點是存儲單元是線性連續(xù)的。存儲單元的最小單位是字節(jié)。,1.內存的概念,地址:為了訪問內存中的某個存儲單元,我們要為它編號,這種編號稱為內存地址。通過地址我們就能夠訪問該地址所標識的存儲單元。,2.地址的概念,變量的地址:變量在內存中總占用幾個連續(xù)的字節(jié),開始字節(jié)的地址,就是變量的地址。,2007,存儲單元,main()intiA,iB,iC;floatfX,fY,fZ;iA=iB=3;fX=fY=4.0;iC=iA+iB;fZ=fX+fY;

2、,8.1什么是指針,指針就是變量的地址E.g.fX的地址為1000,那么1000就是fX的指針。也可以說,1000指向fX。E.g.iA的地址為1500,那么1500就是iA的地址。也可以說,1500指向iA.,指針不僅僅是變量的地址,還包含了其指向變量的類型信息.E.g.1000是fX的指針,其指向1000開始的浮點數(shù)。E.g.1500是iA的指針,其指向1500開始的整數(shù).,直接訪問與間接訪問直接訪問:按變量地址存取變量值間接訪問:通過存放變量地址的變量去訪問變量,例i=3;-直接訪問,3,例inti=3,*p;p=-間接訪問,8.2指針變量,定義指針變量的說明,變量名p前面的“*”不能省

3、略,如寫成int*p1,p2;則p2被定義為整型變量,而非整型指針變量。,用來指定該指針變量可以指向的變量的類型。在定義指針變量時必須指定基類型。(因為不同類型的變量在內存中所占字節(jié)數(shù)不同,這就涉及到指針移動時,移動一步越過幾個字節(jié)的問題),把一個整型變量的地址賦給一個指針變量,即實現(xiàn)指向。,定義中的“*”表示所定義的變量是指針變量,但指針變量名是p1、p2,而非*p1、*p2。,指針變量只能指向定義時所規(guī)定類型的變量。這個規(guī)定的類型稱為該指針變量的“基類型”。,如上例中p只能指向整型變量,不能指向實型或字符型變量。其“基類型”相同,是整型。,定義指針變量后,并未確定該變量指向何處。也就是說該

4、變量的值是不確定的。在引用指針變量前必須首先讓它指向一個變量。如inti,*p;p=,由此可見:通過指針運算符“*”可以引用一個變量。如:當p已經(jīng)指向變量i后,*p就等同于i。*ptr=15;等價于i=15;,二、指針變量的引用,printf(“%d,%dn”,i,*p);scanf(“%d,%dn”,例1:main()inta,b,*p1,*p2;a=100;b=10;p1=運行結果:100,10100,10,例2:輸入a和b兩個整數(shù),按先大后小的順序輸出。main()inta,b,*p1,*p2,*p;scanf(“%d”,三、指針變量作為函數(shù)參數(shù),例1:編寫實現(xiàn)兩個數(shù)的交換的函數(shù),作用:

5、將一個變量的地址傳送到另一個函數(shù)中。,swap(int*p1,int*p2)inttemp;temp=*p1;*p1=*p2;*p2=temp;main()inta,b,*p1,*p2;p1=,例4:編寫函數(shù),根據(jù)傳送過來的運算符,對傳送過來的兩個浮點數(shù)進行+、-、*、/運算,把結果傳回調用函數(shù)(不用return語句)。,Xx(charm,float*p1,float*p2,float*p3)if(m=+)*p3=*p1+*p2;elseif(m=-)*p3=*p1-*p2;elseif(m=*)*p3=(*p1)*(*p2);else*p3=(*p1)/(*p2);Main()floata,

6、b,s,*z,*x,*c;chary;z=,8.3通過指針引用數(shù)組,C規(guī)定:,數(shù)組名代表數(shù)組的首地址(起始地址).如:inta10,*p;則:p=a;與p=等價稱指針變量p指向數(shù)組元素a0,指針變量p指向數(shù)組時,p+1指向數(shù)組的下一個元素。p+i、a+i、for(i=0;i10;i+)printf(%4d,*(a+i);,例2:用指針變量指向數(shù)組元素利用指針變量效率最高。main()inta10=54,65,8,2,3,56,8,21,57,98,*p,i;p=a;for(i=0;i10;i+)printf(%4d,*p+);,(1)指針變量與數(shù)組名的區(qū)別:指針變量是地址變量,數(shù)組名是地址常量

7、。即指針變量的內容可以在程序運行過程中被改變;數(shù)組名一旦被定義,它的值就不能被改變了。,但前面用a+i表示第二個元素的地址,因為a的值沒變。而a+表示a=a+1,不能給常量賦值,利用指針變量編程時特別要注意指針變量的當前值。,應插入語句p=a;,三、數(shù)組名作函數(shù)的參數(shù),例如:f(intarr,intn)main()intarray10;f(array,10);,能接受并存放地址值的只能是指針變量。C編譯系統(tǒng)都是將形參數(shù)組名作為指針變量來處理的。例中f(intarr,intn)等價于f(int*arr,intn)。使用形參數(shù)組的概念只是為了與實參數(shù)組對應,直觀,便于理解而已。,例:從10個數(shù)中找

8、出其中最大值和最小值。,main()voidmax_min(inta,intn,int*p1,int*p2);inti,b10=2,4,1,6,7,32,45,75,45,90,max,min;max_min(b,10,main()voidmax_min(int*x,intn,int*max,int*min);inti,b10=2,4,1,6,7,32,45,75,45,90,max,min;max_min(b,10,x+,上例中如果形參數(shù)組用指針變量,則程序如下:,實參與形參都用數(shù)組名;,實參用數(shù)組名,形參用指針變量;,例:實參、形參都用指針變量的形式,main()inta10,*p;p=a

9、;f(p,10);,f(int*x,intn),例:實參為指針變量,形參用數(shù)組名。,main()inta10,*p;p=a;f(p,10);,f(intx,intn),對于二維數(shù)組:(1)a是數(shù)組名,包含三個元素a0,a1,a2(2)每個元素ai又是一個一維數(shù)組,包含4個元素,inta34;,基類型,行指針與列指針,四、多維數(shù)組與指針,對二維數(shù)組inta34,有a-二維數(shù)組的首地址,即第0行的首地址a+i-第i行的首地址ai*(a+i)-第i行第0列的元素地址ai+j*(a+i)+j-第i行第j列的元素地址*(ai+j)*(*(a+i)+j)aij,a+i=for(i=0;i2;i+)p=ai

10、;for(j=0;j3;j+)scanf(“%d”,p+j);printf(“%d”,*(p+j);,分別把第0行第1行的起始地址放入P中,因為a0,a1是一行的起始地址,其中每行還包含有三個元素:a00a01a02,p=a0只是把第0行的起始地址給P,此時p+1表示第0行第1列的那個元素(a01)的地址,所以P+j分別表示第0行各元素的地址。要想使P指向第二行,必須重新賦給P第二行的首地址。p=a1,指向一維數(shù)組的指針變量定義形式:數(shù)據(jù)類型(*指針名)一維數(shù)組維數(shù);例int(*p)4;,()不能少int(*p)4與int*p4不同,p的值是一維數(shù)組的首地址,p是行指針,可讓p指向二維數(shù)組某一

11、行如inta34,(*p)4=a;,一維數(shù)組指針變量維數(shù)和二維數(shù)組列數(shù)必須相同,例題一維數(shù)組指針變量舉例,main()staticinta34=1,3,5,7,9,11,13,15,17,19,21,23;inti,j,(*p)4;p=a;for(i=0;i3;i+)for(j=0;j4;j+)printf(%d,*(*p+j);p+;,p0j,8.4通過指針引用字符串,定義了一個指向字符串的指針變量,并將字符串的首地址賦值給strp指針變量,即:使指針變量strp指向字符串首地址。,C程序訪問字符串有以下兩種方法:,2用字符指針指向一個字符串,例如:char*ps=Iamastudent.;

12、字符串輸出語句可寫成:printf(“%sn”,ps);*以字符串形式輸出時寫字符串的地址*,說明:,字符數(shù)組由若干個元素組成,每個元素中放一個字符。而字符指針變量中存放的是字符串的首地址,不是將字符串放到字符指針變量中。例如:char*ps=Iamastudent.;,字符數(shù)組和字符指針變量都可以在定義時賦初值。chars10;s=“hello!”;chars10=“hello”;=chars10=h,e,l,l,o,0;char*ps;ps=“hello!”;=char*ps=“hello”;,字符指針變量必須先賦值后使用,否則對系統(tǒng)構成危險。char*ps;scanf(“%s”,ps);

13、char*ps,s10;ps=s;scanf(“%s”,ps);,字符數(shù)組名是指針常量,只能表示一個確定的字符串,不能改變。字符指針變量的值是可改變的。,若定義了一個指針變量,并使它指向一個字符串,就可以用下標形式引用指針變量所指字符串中的字符。如:char*a=“IloveChina!”;printf(“%c”,a5);,用指針變量指向一個格式字符串,可以用它代替printf函數(shù)的格式字符串。如:inta;char*format;format=“a=%dn”;則:printf(format,a);相當于printf(“a=%dn”,a);,main()char*a=“iamastudent”;a=a+7;printf(“%s”,a);結果:student,main()charc=“iamastudent”;c=c+7;printf

溫馨提示

  • 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

提交評論