




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C-LANGUAGE第八章指針指針的概念⒈指針可以理解為地址,一個(gè)變量在內(nèi)存單元的首地址稱為該變量的“指針”,通過(guò)變量指針可以找到該變量所占用的內(nèi)存單元。⒉指針變量,即專門用來(lái)存放內(nèi)存地址的變量。也就是說(shuō),如果有一個(gè)變量專門用來(lái)存放另一變量的地址(即指針),則它稱為“指針變量”。指針是一個(gè)地址,而指針變量是存放地址的變量。⒊指針變量的定義形式為:類型名*指針變量名;e.g.int*p,*q;說(shuō)明:①指針變量的類型名用來(lái)指定該指針變量可以指向的變量的類型。2指針的概念②在定義指針變量時(shí)必須指定類型名。一個(gè)指針變量只能指向同一類型的變量,不能忽而指向一個(gè)整型變量,忽而指向一個(gè)實(shí)型變量。③指針變量前面的“*”表示該變量的類型為指針型變量。④在定義指針變量時(shí)必須指定類型名,如果指針是指向一個(gè)整型變量,那么“使指針移動(dòng)1個(gè)位置”意味著移動(dòng)4個(gè)字節(jié),“使指針加1”意味著使地址值加4個(gè)字節(jié)。⒋指針變量的引用說(shuō)明:C語(yǔ)言中對(duì)指針變量的引用是通過(guò)“&”和“*”兩個(gè)運(yùn)算符實(shí)現(xiàn)的。其中,&是取地址符。
它的一般格式為:&變量名*是取值運(yùn)算符,又稱間接訪問(wèn)運(yùn)算符。
它的格式為:*指針變量名3指針的概念例題:main(){intx,y;int*p;x=10;p=&x;y=*p;printf(“y=%d\n”,y);}note:”*”運(yùn)算符在該例中兩次出現(xiàn),分別代表兩種不同的含義。在定義變量時(shí),“*”只起標(biāo)記作用,用來(lái)說(shuō)明所定義的變量是指針變量。在非定義狀態(tài)下,“*”是間接訪問(wèn)運(yùn)算符,用來(lái)獲取指針變量所指向變量的內(nèi)容。表示p是指向整型變量的指針變量表示通過(guò)取地址符&將變量x的地址賦給指針變量p表示把p所指向的變量的值賦給y4指針的概念⒌指針變量的初始化指針變量在使用之前必須對(duì)其進(jìn)行初始化,使指針變量指向一個(gè)確定的內(nèi)存單元。一般形式為:
類型說(shuō)明符*指針變量名=初始地址值;e.g.inta=10;int*p=&a;note:①任何指針變量在使用之前都要進(jìn)行定義并賦值,未經(jīng)賦值的指針變量是禁止使用的。②在初始化指針時(shí),要注意類型匹配的問(wèn)題,也就是說(shuō),必須是同一類型數(shù)據(jù)的地址才能進(jìn)行指針初始化。③可以把一個(gè)指針的值賦給另一個(gè)指針,但不能直接用整型數(shù)據(jù)賦值給指針變量。5指針的概念⒍指針的運(yùn)算在C語(yǔ)言程序中,指針只能進(jìn)行賦值運(yùn)算,部分算術(shù)運(yùn)算及關(guān)系運(yùn)算。⑴賦值運(yùn)算說(shuō)明:指針變量的賦值運(yùn)算只能在同一數(shù)據(jù)類型之間進(jìn)行。e.g.int*p1,*p2,a,s[5];
int*p1=&a;/*指針變量初始化賦值*/p2=&a;/*把變量a的地址賦給指針變量p2*/p1=s;/*把數(shù)組s的首地址賦給指針變量p1*/p1=&s[3];/*把數(shù)組元素s[3]的地址賦給指針變量p1*/P1=Null;/*把空指針Null賦給指針變量p1*/6指針的概念說(shuō)明:Null是一個(gè)符號(hào)常量,在stdio.h頭文件中有對(duì)它的定義。將指針變量賦值為Null,表示該指針變量當(dāng)前未指向任何變量,其值為0.note:給指針變量賦0值和不賦值是不同的。指針變量未賦值時(shí),程序編譯時(shí)分配給指針變量的存儲(chǔ)空間中的值是不確定的,可以是任何值,直接使用該指針變量有可能造成錯(cuò)誤。而指針變量被賦Null值后,值是確定的,則可以使用,只是它未指向具體的變量。⑵算術(shù)運(yùn)算描述:主要是對(duì)指針變量加上或減去一個(gè)整數(shù),這樣會(huì)使指針變量指向相鄰的存儲(chǔ)單元,即指針的移動(dòng)。只有指針變量指向一片連續(xù)的存儲(chǔ)單元時(shí),指針的移動(dòng)才有意義。7指針的概念e.g.在內(nèi)存中有一片地址連續(xù)的存儲(chǔ)單元,基本類型為int類型的指針變量p指向地址為1000的存儲(chǔ)單元,若執(zhí)行操作p=p+1;則指針變量p指向首地址為1004的存儲(chǔ)單元。note:指針變量p的基本類型為int,移動(dòng)一個(gè)存儲(chǔ)單元的長(zhǎng)度就是移動(dòng)4個(gè)字節(jié)。因此,對(duì)指針變量進(jìn)行加減運(yùn)算時(shí),數(shù)字“1”不再代表十進(jìn)制整數(shù)”1“,而是指一個(gè)存儲(chǔ)單元長(zhǎng)度。⑶關(guān)系運(yùn)算描述:其實(shí)就是比較地址值的大小。設(shè)p、q是指向同一數(shù)據(jù)集合的指針變量,若p>q的值為真,則表明p指針變量所指向的元素在q指針變量所指向的元素之后。像p>=q,p<=q,p==q,p!=q都是用來(lái)判斷同一數(shù)據(jù)集合中元素的位置關(guān)系的。⑷兩指針變量相減變量值之差是兩個(gè)指針間元素的個(gè)數(shù)。
8指針的概念練習(xí):有以下程序:#include<stdio.h>main(){intm=1,n=2,*p=&m,*q=&n,*r;r=p;p=q;q=r;printf(“%d,%d,%d,%d\n”,m,n,*p,*q);}程序運(yùn)行后的輸出結(jié)果是:A)1,2,1,2B)1,2,2,1C)2,1,2,1D)2,1,1,2答案:B9指針與數(shù)組數(shù)組中的元素在內(nèi)存中是連續(xù)存儲(chǔ)的,所以任何用數(shù)組下標(biāo)完成的操作都可以通過(guò)指針的移動(dòng)來(lái)實(shí)現(xiàn)。⒈指針與一維數(shù)組一維數(shù)組中,第一個(gè)元素的地址即為該數(shù)組的起始地址,即首地址。⑴指針變量與一維數(shù)組的聯(lián)系①指針變量指向的是元素地址。在數(shù)組中,數(shù)組名即代表數(shù)組的首地址,如果需要指針指向數(shù)組,直接將數(shù)組名賦予指針變量即可。e.g.inta[6],*pa;pa=a;或pa=&a[0];說(shuō)明:由于數(shù)組名a代表該數(shù)組的首地址,即a[0]的地址,因此指針變量pa保存了該數(shù)組的首地址,此時(shí),pa,a,&a[0]均指向同一內(nèi)存單元。10指針與數(shù)組②也可在定義指針變量時(shí)直接對(duì)其初始化。e.g.inta[10],*pa=a;③程序設(shè)計(jì)中,可以在指針變量定義后讓指針變量指向某一個(gè)數(shù)組元素地址。e.g.pa=&a[3];note:數(shù)組名a是一個(gè)地址常量,它永遠(yuǎn)指向a數(shù)組的首地址,因此不能對(duì)a進(jìn)行重新賦值。⑵用指針訪問(wèn)數(shù)組元素在對(duì)數(shù)組元素引用時(shí)是通過(guò)數(shù)組名和一對(duì)方括號(hào)來(lái)完成。①通過(guò)指針引用數(shù)組元素e.g.int*p,a[5];P=&a[0];指針變量p指向數(shù)組元素a[0],因此可使用訪問(wèn)運(yùn)算符”*“來(lái)引用變量a[0].e.g.*p=1811指針與數(shù)組②若p的初值為&a[0],則ⅰ)p+i和a+i就是a[i]的地址,或者說(shuō)它們指向a數(shù)組的第i個(gè)元素。ⅱ)*(p+i)或*(a+i)就是p+i或a+i所指向的數(shù)組元素,即a[i]。即按數(shù)組首元素的地址加上相對(duì)位移量得到要找的元素的地址,然后找出該單元中的內(nèi)容。③p[i]與*(p+i)等價(jià)④要注意指針變量的當(dāng)前值⑤注意指針變量的運(yùn)算(使p指向數(shù)組a的首元素)ⅰ)p++(或p+=1),使p指向下一元素,即a[1],*p,取a[1]的值。ⅱ)*p++等價(jià)于*(p++)作用是先得到p指向的變量的值(即*p),再使p+1。ⅲ)*(p++)與*(++p)作用不同,前者是先取*p值,后使p加1.后者是先使p加1,再取*p。ⅳ)(*p)++表示p所指向的元素值加1.note:是元素值加1,而不是指針值加1.12指針與數(shù)組練習(xí):有以下程序:#include<stdio.h>main(){chars[]=“rstuv”;printf(“%c\n”,*s+2);}程序運(yùn)行后的輸出結(jié)果是()A)tuvB)字符t的ASCII碼值C)tD)出錯(cuò)答案:C13指針與數(shù)組⑶用數(shù)組名作函數(shù)參數(shù)①數(shù)組元素作實(shí)參——”值傳遞“方式②用數(shù)組名作函數(shù)參數(shù)實(shí)參數(shù)組名代表該數(shù)組首元素的地址,而形參是用來(lái)接收從實(shí)參傳遞過(guò)來(lái)的數(shù)組首元素地址的。note:Ⅰ)當(dāng)用變量名作為函數(shù)參數(shù)時(shí)傳遞的是變量的值,當(dāng)用數(shù)組名作為函數(shù)參數(shù)時(shí),由于數(shù)組名代表的是數(shù)組首元素的地址,因此傳遞的值是地址,所以要求形參為指針變量或形參數(shù)組。Ⅱ)形參數(shù)組從實(shí)參數(shù)組那里得到起始地址,因此形參數(shù)組與實(shí)參數(shù)組共同占一段內(nèi)存單元,在調(diào)用函數(shù)期間,如果改變了形參數(shù)組的值,也就改變了實(shí)參數(shù)組的值。14指針與數(shù)組③如果有一個(gè)實(shí)參數(shù)組,要想在函數(shù)中改變此數(shù)組中的元素的值,實(shí)參與形參的對(duì)應(yīng)關(guān)系有以下4種ⅰ)形參和實(shí)參都用數(shù)組名ⅱ)實(shí)參用數(shù)組名,形參用指針變量ⅲ)實(shí)參形參都用指針變量ⅳ)實(shí)參為指針變量,形參為數(shù)組名15指針與數(shù)組練習(xí):有以下程序#include<stdio.h>intf(int*a,int*b){ints;s=*a+*b;returns;}main(){intx=2,y=4,s;s=f(&x,&y);printf(“%d\n”,s);}執(zhí)行后的輸出結(jié)果是:答案:616指針與數(shù)組經(jīng)典例題:⑴#include<stdio.h>voids*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}main(){inta,b;int*pointer_1,*pointer_2;scanf(“%d,%d”,&a,&b);pointer_1=&a;pointer_2=&b;if(a>b)s);printf(“\n%d,%d\n”,a,b);}17指針與數(shù)組⑵若將上述函數(shù)改成voidsx,inty){inttemp;temp=x;x=y;y=temp;}main函數(shù)中改為s);⑶若將上述函數(shù)改成voids*p1,int*p2){int*p;p=p1;p1=p2;p2=p}18指針與數(shù)組⒉指針與二維數(shù)組⑴二維數(shù)組的首地址和數(shù)組元素的地址e.g.inta[2][3];①任何一個(gè)二維數(shù)組都由若干個(gè)一維數(shù)組組成。C語(yǔ)言允許把一個(gè)二維數(shù)組分解為多個(gè)一維數(shù)組來(lái)處理。因此數(shù)組a可以理解為由兩個(gè)一維數(shù)組組成,即數(shù)組a由a[0]、a[1]兩個(gè)元素組成,a是二維數(shù)組名,而每個(gè)元素又各自含有3個(gè)元素。a[0]、a[1]既然是一維數(shù)組名,而C語(yǔ)言規(guī)定數(shù)組名代表數(shù)組的首地址,則a[0]代表數(shù)組元素a[0][0]的地址,即&a[0][0].a[1]的值為&a[1][0]。②二維數(shù)組名是一個(gè)地址常量note:①對(duì)于二維數(shù)組名a,也不可以進(jìn)行a++、a=a+i;之類賦值運(yùn)算。②在二維數(shù)組中,a的值與a[0]的值相同,但是基本類型不同。a等價(jià)于一個(gè)二維指針,而a[0]是一個(gè)一維指針,因此,以下賦值是不正確的。
inta[3][4]={0},*p;p=a;19指針與數(shù)組③a指針的基類型是擁有3個(gè)元素的一維數(shù)組,地址a+1表示的是a[1]的地址,a+2表示的是a[2]的地址,所以a+i與&a[i]等價(jià),*(a+i)與a[i]等價(jià)。⑵二維數(shù)組元素及地址①取數(shù)組元素a[i][j]的地址的5種方法&a[i][j]a[i]+j*(a+i)+j&a[0][0]+x*i+ja[0]+x*i+j20指針與數(shù)組②數(shù)組a的性質(zhì)表示形式含義a數(shù)組名,0行首地址a[0],*(a+0),*a0行0列元素地址a+1,&a[1]1行首地址a[1],*(a+1)1行0列,a[1][0]的地址a[1]+2,*(a+1)+2,&a[1][2]a[1][2]的地址*(a[1]+2),*(*(a+1)+2),a[1][2]a[1][2]的值21指針與數(shù)組說(shuō)明:Ⅰ)在指向行的指針前面加一個(gè)“*”,就轉(zhuǎn)換為指向列的指針。反之,在指向列的指針前面加“&”,就成為指向行的指針。Ⅱ)*(a+i)只是a[i]的另一種表示形式,不要簡(jiǎn)單的認(rèn)為*(a+i)是a+i所指單元中的內(nèi)容,在一維數(shù)組中a+i所指的是一個(gè)數(shù)字元素的存儲(chǔ)單元。在該單元中有具體的值,而對(duì)二維數(shù)組,a+i不是指向具體存儲(chǔ)單元而指向行。練習(xí):設(shè)有定義doublea[10],*s=a;以下能夠代表數(shù)組元素a[3]的是()A)(*s)[3]B)*(s+3)C)*s[3]D)*s+3;答案:B22指針與數(shù)組③定義指針數(shù)組指針數(shù)組一般定義形式為:
類型名*指針數(shù)組名[常量表達(dá)式];e.g.int*p[3];解釋:定義了一個(gè)具有3個(gè)元素的一維數(shù)組,每個(gè)元素都只能存放指針,這些指針的基本類型都必須為整型,故稱p為指針數(shù)組。說(shuō)明:[]的優(yōu)先級(jí)高于*,因此p先與[]結(jié)合,構(gòu)成p[3],說(shuō)明p是個(gè)數(shù)組名,在它前面的*號(hào),說(shuō)明數(shù)組p中的每個(gè)元素只能存放指針。p[0]p[1]p[2]23指針與數(shù)組可以通過(guò)指針數(shù)組p來(lái)引用a數(shù)組元素,等價(jià)如下ⅰ)*(p[i]+j)與*(a[i]+j)對(duì)應(yīng)ⅱ)*(*(p+i)+j))與*(*(a+i)+j)對(duì)應(yīng)ⅲ)(*(p+i))[j]與*(*(a+i))[j]對(duì)應(yīng)ⅳ)p[i][j]與a[i][j]對(duì)應(yīng)例題:inta[3][2]={1,2,3,4,5,6},*p[3];p[0]=a[1];分析程序。。。24指針與數(shù)組④定義行指針行指針的一般定義形式:類型名(*指針數(shù)組名)[常量表達(dá)式];e.g.int(*P)[2];解釋:定義了一個(gè)指針變量p,p只能存放含有兩個(gè)整型元素的一維數(shù)組的首地址。note:p并不是一個(gè)含有兩個(gè)元素的一維數(shù)組。說(shuō)明:()的優(yōu)先級(jí)高于[],因此p先與*結(jié)合,說(shuō)明p是一個(gè)指針變量,在它后面的[2]則說(shuō)明指針p的基類型為2個(gè)整型元素,所以p+1不是讓指針p移動(dòng)一個(gè)整型大小,而是移動(dòng)兩個(gè)整型大小。⑤指針數(shù)組與行指針的區(qū)別a[2][0]a[2][1]a[0][0]a[0][1]a[1][0]a[1][1]p+0p+1p+2int(*p)[2],a[3][2];p=a;25指針與字符串⒈e.g.char*p=“China”;或char*p;p=“China”;解釋:把字符串“China”賦值給字符指針p,即把保存字符串“China”的內(nèi)存的首地址賦給了指針p。使得指針p指向了字符串“China”,這樣就可以通過(guò)指針p來(lái)處理字符串“China”。
charstr[1O];str=“China”;⒉訪問(wèn)一個(gè)字符串的兩種方法e.g.char*string=“IloveChina!”;等價(jià)于char*string;string=“IloveChina!”;這是錯(cuò)誤的賦值用字符數(shù)組存放一個(gè)字符串,然后輸出用字符指針指向一個(gè)字符串26指針與字符串練習(xí):有以下程序#include<stdio.h>voidfun(char*t,char*s){while(*t!=0)t++;while((*t++=*s++)!=0);}main(){charss[10]=“acc”,aa[10]=“bbxxyy”;fun(ss,aa);printf(“%s,%s\n”,ss,aa);}程序的運(yùn)行結(jié)果是()A)accxyy,bbxxyyB)acc,b
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 五年級(jí)上冊(cè)數(shù)學(xué)教案-分?jǐn)?shù)的再認(rèn)識(shí) 北師大版
- 六年級(jí)下冊(cè)數(shù)學(xué)教案 用不同的知識(shí)解答應(yīng)用題 西師大版
- 二年級(jí)下冊(cè)數(shù)學(xué)教案-5.2 被減數(shù)中間有0的連續(xù)退位減法| 青島版(五四學(xué)制)
- 口腔門診勞動(dòng)合同(2025年版)
- 一年級(jí)下冊(cè)數(shù)學(xué)教案-動(dòng)手做(一)2 北師大版
- 六年級(jí)下冊(cè)數(shù)學(xué)教案-總復(fù)習(xí)-四則運(yùn)算的意義和法則|北師大版
- 三年級(jí)上冊(cè)數(shù)學(xué)教案-用兩步連乘解決實(shí)際問(wèn)題∣蘇教版
- 2024年張緊裝置項(xiàng)目資金申請(qǐng)報(bào)告代可行性研究報(bào)告
- 2025年華北理工大學(xué)輕工學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)帶答案
- 數(shù)學(xué)-廣州市白云區(qū)2025年高三下學(xué)期期初綜合訓(xùn)練試題+答案
- 部編版小學(xué)五年級(jí)語(yǔ)文教材培訓(xùn)課件【部編】
- 盆景造型經(jīng)驗(yàn)
- 2023年廣東省佛山市順德區(qū)小升初數(shù)學(xué)試卷(含答案)
- ICU護(hù)理查房記錄【范本模板】
- 威風(fēng)堂堂進(jìn)行曲
- 銅及銅合金物理冶金基礎(chǔ)-黃銅
- 煤礦信息化管理制度
- 金融科技學(xué)-完整全套課件
- 物理學(xué)史中國(guó)古代物理學(xué)
- 導(dǎo)管滑脫應(yīng)急預(yù)案演練住院患者導(dǎo)尿管道滑脫
- (完整)小學(xué)語(yǔ)文考試專用作文方格紙
評(píng)論
0/150
提交評(píng)論