變量的指針和指針變量_第1頁
變量的指針和指針變量_第2頁
變量的指針和指針變量_第3頁
變量的指針和指針變量_第4頁
變量的指針和指針變量_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第8章 指針 變量的指針和指針變量 數(shù)組的指針和指向數(shù)組的指針變量 字符串指針和指向字符串的指針變量 函數(shù)的指針和指向函數(shù)的指針變量 返回指針值的函數(shù) 指針數(shù)組和指向指針的指針 main函數(shù)的命令行參數(shù) 指針 變量的指針就是它的地址。通過變量的地址能找到該變量在內(nèi)存中的存儲單元,從而得到它的值,稱為直接訪問。存放地址的變量叫做指針變量。指向某變量的指針變量存放該變量的首地址,即指向該變量的首字節(jié)。通過指針變量得到所指變量的地址,再訪問變量,稱為間接訪問。指針變量的定義 在一個指針變量中只能存放同一類型變量的地址。指針變量必須先定義,才能使用。定義指針變量的一般形式: 類型 *指針變量名例如:i

2、nt *a,*b; 指針變量的賦值 指針變量賦值語句的一般形式:指針變量名=&變量名;例如: int a,b; int *p1,*p2; p1=&a; /*將a的首地址賦給p1 */ p2=&b; 指針變量的引用 可以使用以下兩個指針相關(guān)運(yùn)算符: & 取地址運(yùn)算符 如:p=&a 將a的地址送入p * 指針運(yùn)算符(間接訪問運(yùn)算符) 如:*p就是p所指向的變量,也就是a。注意: *p與a等價的前提是p=&a;。 例如 main () int a=10,b=20; int *p1,*p2; p1=&a;p2=&b; printf(%d,

3、%dn,a,b); printf(%d,%dn,m,n); printf(%d,%dn,*m,*n); 運(yùn)行結(jié)果:10,20 -38,-36 10,20 將兩個數(shù)從大到小輸出。main () int a,b,*p1,*p2,*p; scanf(%d,%d,&a,&b); p1=&a;p2=&b; if(ab) p=p1;p1=p2;p2=p; printf(a=%d,b=%dn,a,b); printf(%d,%dn,*p1,*p2); 指針變量作函數(shù)參數(shù) 將主調(diào)函數(shù)變量的地址作為實(shí)參,傳給被調(diào)函數(shù)的指針形參。在函數(shù)調(diào)用的過程中,使形參所指向的變量值發(fā)生變化。

4、將兩個變量的內(nèi)容交換后輸出 swap(int *p1,int *p2)int t; t=*p1;*p1=*p2;*p2=t; main ( )int a,b; scanf(%d,%d,&a,&b); printf(a=%d,b=%dn,a,b); swap(&a,&b); printf(a=%d,b=%dn,a,b); 如果想通過函數(shù)調(diào)用得到n個要改變的值,可以:1在主調(diào)函數(shù)中設(shè)n個變量,用n個指針變量指向它們;2然后將指針變量作為實(shí)參,將這n個變量的地址傳給被調(diào)函數(shù)的形參;3通過指針變量,改變這n個變量的值;主調(diào)函數(shù)中就可以使用這些改變了值的變量。 數(shù)組的指針

5、和指向數(shù)組的指針變量 數(shù)組元素的指針是數(shù)組元素的地址。數(shù)組的指針是指數(shù)組的起始地址,即第一個元素的地址。數(shù)組名表示數(shù)組的起始地址。 例如:int a10,*p; p=a; 指針也可指向數(shù)組中的其它元素例如:int a10;int *p=&a5;則p是指向數(shù)組元素a5的指針,也就是說,p存放的是a5的地址。通過指針引用數(shù)組元素 1可以通過指針為數(shù)組元素賦值。例如:int a10; int *p; p=a; a0=2 與*p=2等價。 2指向數(shù)組的指針可以指向數(shù)組中的其它元素。例如:int a10,*p=a; p+;此時p指向數(shù)組a的第二個元素。即p中存放a1的地址。 3指向數(shù)組的指針變量

6、也可以帶下標(biāo)。例如:int a10,*p=a,i;可以使用ai、*pi、(a+i)或*(p+i)引用a數(shù)組中第i個元素。注意:指針移動不能超出數(shù)組元素的范圍。輸出數(shù)組中的數(shù) main ( ) int a10,i,*p; for(i=0;i10;i+) ai=i; for (p=a;pa+10;p+) printf(%4d,*p);注意注意 +和*是同優(yōu)先級,右結(jié)合。例如: *m+和*(m+)等價,(*m)+表示m所指向的元素值加1。數(shù)組名可以作為實(shí)參傳給形參。由于數(shù)組名是一個地址值,對應(yīng)的形參應(yīng)該是一個數(shù)組或一個指針變量。當(dāng)形參被定義為數(shù)組時,C系統(tǒng)按指針變量處理。 求10個數(shù)的平均值 flo

7、at average(float *array)int i; float aver,sum=0; for (i=0;i10;i+) sum=sum+arrayi; aver=sum/10; return (aver); main ( )float score10,aver;int i; for(i=0;i10;i+) scanf(%f,&scorei); aver=average(score); printf(Average score is %5.2f,aver); 二維數(shù)組的指針1. 二維數(shù)組的指針有行指針和列指針。 int a22=1,2,3,4; a是二維數(shù)組名,是二維數(shù)組的起

8、始地址。2.a0、a1是二維數(shù)組中2個一維數(shù)組的名字,是2個一維數(shù)組的起始地址。a0指向0行0列元素,a1指向1行0列元素;它們是列指針。 a是數(shù)組0行首地址,a+1是數(shù)組1行首地址,a、a+1是行指針。3. ai與*(a+i)等價,aij、*(ai+j)、*(*(a+i)+j)都是第i行第j列元素。說明4.可以定義指向一維數(shù)組的指針變量。例如:int(*p)2;例如: int a22,(*p)2; p=s; p+1表示數(shù)組a的1行首地址。例如 #include main() int a22=1,2,3,4,(*p)2=a,i,j; for(i=0;i2;i+) f o r ( j = 0 ;

9、 j 2 ; j + + ) printf(“%d,%d,%d”,aij,*(*(a+i)+j),*(*(p+i)+j) ;字符串的指針 C語言表示一個字符串可以有兩種方法:方法一:字符數(shù)組方法二:字符指針例如 main ( )char s=I am a student“,*p=s; printf(%s %sn,s,p); main ( ) int *p=I am a student; printf(%sn,p); C語言對字符串常量是按照字符數(shù)組處理的,在內(nèi)存開辟了一段空間用來存放字符串,并把字符串首地址賦給了字符指針變量p。 字符指針變量與字符數(shù)組 字符數(shù)組和字符指針的共同點(diǎn)是都可以實(shí)現(xiàn)字

10、符串的存儲和運(yùn)算。它們的區(qū)別如下:1字符數(shù)組由若干個元素組成,每個元素存放一個字符,而字符指針變量存放的是字符串的首地址。2. 在賦值語句中,不能對整個字符數(shù)組賦值,只能對各個元素賦值。而對指針變量,卻可以直接將字符串的首地址賦給指針變量。 例如:char *a=“I am student”; 等價于 char *a; a=I am student;將字符串按逆序存放后輸出 #include #include main ( )char t,ch80,*p,*q; gets(ch); puts(ch); for(p=ch,q=p+strlen(ch)-1;py?x:y; return(z);返回

11、指針值的函數(shù) 一個函數(shù)可以返回指針型的數(shù)據(jù),即地址。 #include char *fun(char *); main () char ch=a,*p=&ch,*q; q=fun(p); puts(q); char *fun(char *s) char *t=big; *(t+1)=*s; return t;運(yùn)行結(jié)果:bag 指針數(shù)組 元素均為指針的數(shù)組稱為指針數(shù)組,即數(shù)組中的每一個元素都是指針變量。指針數(shù)組的定義形式: 類型 *數(shù)組名長度;例如:int *p4;/*注意與int(*p)4區(qū)別,這是指向一維數(shù)組的指針變量。*/指針數(shù)組經(jīng)常用于處理多個字符串。 #include #inc

12、lude main ( )int i,k; char *str=China,Japan,French; for(i=1,k=0;i3;i+) if (strcmp(strk,stri)0) k=i; printf(The largest string is:%sn,strk);運(yùn)行結(jié)果:The largest string is:Japan指向指針的指針 指針變量也有地址,這個地址可以存放在另一個指針變量中。例如:char *p,*q=abc; p=&q; 則變量p是指向指針變量q的指針。 例如 main ( )char *str=China,Japan,French; char *q=str; int i; fo

溫馨提示

  • 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

提交評論