版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
6.1指針與指針變量6.1.1指針在計(jì)算機(jī)中,內(nèi)存由一個(gè)個(gè)具有連續(xù)編碼的存儲(chǔ)單元所組成,即每一個(gè)存儲(chǔ)單元都具有唯一的、固定的編號(hào),這個(gè)編號(hào)稱為內(nèi)存單元的地址。如果在程序中定義了一個(gè)變量,由于不同的數(shù)據(jù)類型占據(jù)不同字節(jié)的存儲(chǔ)空間,在編譯時(shí),系統(tǒng)就根據(jù)程序中定義的變量類型,分配相應(yīng)的存儲(chǔ)空間。例如,對(duì)整型變量分配2個(gè)字節(jié),對(duì)實(shí)型變量分配4個(gè)字節(jié),對(duì)字符型變量分配1個(gè)字節(jié),而每一個(gè)字節(jié)都有一個(gè)地址。每個(gè)變量的首字節(jié)的地址稱為該變量的地址。一個(gè)變量的地址稱為這個(gè)變量的指針,指針就是地址。內(nèi)存中的地址常用十六進(jìn)制整型數(shù)表示。如何查看一個(gè)變量的地址呢?可以用取地址運(yùn)算符“&”來(lái)實(shí)現(xiàn)。如運(yùn)行以下程序:main(){inta=26;printf("&a=%x,a=%d\n",&a,a);}可以查看整型變量a的地址(a占2個(gè)字節(jié),看到的是它的首字節(jié)的地址)和a的值。
6.1.2直接訪問(wèn)和間接訪問(wèn)在C語(yǔ)言的程序中,一般是通過(guò)變量名對(duì)內(nèi)存單元進(jìn)行存取操作的。程序經(jīng)過(guò)編譯以后將變量名轉(zhuǎn)換為變量的地址,對(duì)變量值的存取都是通過(guò)地址進(jìn)行的。像這種直接按變量地址存取變量值的方式稱為“直接訪問(wèn)”。如對(duì)以下程序:main(){inta,b,c;a=10;b=16;c=a+b;printf("%d\n",c);}
變量的“間接訪問(wèn)”方式是將變量a的地址存放在另一個(gè)稱為“指針變量”的變量中,當(dāng)要讀取變量a的值時(shí),先從指針變量中取出a的地址,再?gòu)倪@個(gè)地址單元中取出a的值。
6.1.3指針變量的定義和引用如前所述,變量的地址就是變量的指針,存放變量指針(地址)的變量稱為指針變量。指針變量的使用和其他變量的使用一樣需要“先定義,后使用”。1.指針變量的定義
指針變量不同于其他變量,它是用來(lái)專門存放地址的,必須將它定義為“指針類型”。指針變量定義的一般形式為:數(shù)據(jù)類型*指針變量名其中,“數(shù)據(jù)類型”說(shuō)明該指針變量所指向的變量類型,“*”表示所定義的變量是一個(gè)指針變量而不是一個(gè)普通變量。例如:inta,b,*pa,*pb;pa=&a;pb=&b;定義了整型變量a、b及指針變量pa、pb,且pa、pb是用來(lái)指向整型變量的(即用來(lái)存放整型變量的地址)。“&”是取地址運(yùn)算符,pa=&a將變量a的地址存放到指針變量pa中,pb=&b將變量b的地址存放到指針變量pb中。在定義指針變量時(shí)可以賦給初值,例如:inta,b,*pa=&a,*pb=&b;
2.指針變量的引用
在定義了一個(gè)指針變量并確定了它的指向后,就可以利用它來(lái)訪問(wèn)所指向的變量,稱為對(duì)指針變量的引用。引用指針變量的一般形式為:*指針變量名這里的“*”稱為指針運(yùn)算符,也稱為“間接訪問(wèn)”運(yùn)算符。
[例6-1]
指針變量的引用。程序如下:main(){inta,b,*pa,*pb;pa=&a;pb=&b;a=2;b=4;printf("%d,%d\n",*pa,*pb);*pa=10;*pb=20;printf("%d,%d\n",a,b)}程序運(yùn)行結(jié)果:2,410,20注意:在C語(yǔ)言中,“*”符號(hào)目前已出現(xiàn)三種用法,一是乘法符號(hào);二是指針變量定義符;三是指針變量引用符。在上例中,“先定義”指針變量,“后使用”——給它賦值(變量的地址)、引用它。等同于變量a*pa變量a的地址&apa=&a6.2指針運(yùn)算與其他變量一樣,指針也是一種特殊的變量,也有指針運(yùn)算。其中最常用的運(yùn)算有:取地址運(yùn)算&,取值運(yùn)算*,以及指針加、減運(yùn)算等。1.取地址運(yùn)算&取地址運(yùn)算是指取出運(yùn)算符&后面的變量在內(nèi)存中占用的空間的起始地址。因?yàn)楸恢赶虻淖兞靠赡苷加枚鄠€(gè)內(nèi)存單元,指針并不記錄它的所有地址,而只指向它的起始地址。2.取數(shù)據(jù)運(yùn)算*與取地址運(yùn)算符“&”相對(duì)應(yīng)的是取數(shù)據(jù)運(yùn)算符“*”,也稱指針運(yùn)算符。取地址運(yùn)算的操作對(duì)象是變量,而取數(shù)據(jù)運(yùn)算的操作對(duì)象則是指針變量,用于訪問(wèn)某個(gè)地址的數(shù)據(jù)?!?”運(yùn)算符除作為取數(shù)據(jù)運(yùn)算符外,還作為定義指針變量標(biāo)識(shí)符,另外還可作為算術(shù)乘法運(yùn)算符。對(duì)于“*”在不同場(chǎng)合的作用,編譯器能夠根據(jù)上下文環(huán)境判別其作用。3.指針變量的算術(shù)運(yùn)算
在C語(yǔ)言中,可以通過(guò)加減一個(gè)整數(shù)來(lái)移動(dòng)指針。指針增1運(yùn)算后指向下一個(gè)數(shù)據(jù)(注意不是下一個(gè)字節(jié))的位置,指針減1運(yùn)算后指向上一個(gè)數(shù)據(jù)的位置。例如:inta,*pa;pa=&a;pa++;在這段程序中,定義pa為指向整型變量的指針變量,則pa++相當(dāng)于pa=pa+1×2(每個(gè)整型變量在內(nèi)存中占兩個(gè)字節(jié)),即pa++使指針向下移動(dòng)兩個(gè)字節(jié)指向下一個(gè)數(shù)據(jù)。6.3指針與數(shù)組指針與數(shù)組關(guān)系密切。一個(gè)數(shù)組包含若干元素,每個(gè)數(shù)組元素都在內(nèi)存中占用存儲(chǔ)單元,它們都有相應(yīng)的地址。因此,指針變量可以指向數(shù)組和數(shù)組元素。數(shù)組的指針是數(shù)組的起始地址,數(shù)組元素的指針是數(shù)組元素的地址。使用指針可以對(duì)數(shù)組進(jìn)行相關(guān)的操作。6.3.1指向一維數(shù)組的指針變量C語(yǔ)言規(guī)定一維數(shù)組的數(shù)組名代表數(shù)組的首地址,因此數(shù)組名本身就是一個(gè)指針,它指向第1個(gè)數(shù)組元素。其他數(shù)組元素的地址可以通過(guò)數(shù)組名加偏移量來(lái)取得。例如:
inta[20];/*定義一個(gè)長(zhǎng)度為20的一維數(shù)組a,數(shù)組元素為整型*/
int*pa;/*定義指向整型數(shù)據(jù)的指針變量pa*/pa=a;/*為指針變量賦值,注意:數(shù)組名前不加&*/
pa=&a[0];/*本語(yǔ)句與上句等價(jià)*/注意:上述“pa=a;”的作用是“把a(bǔ)數(shù)組的首地址賦給指針變量pa”,“而不是把數(shù)組a各元素的值賦給pa”。一維數(shù)組指針的應(yīng)用十分靈活。例如:如果定義
inta[20],*p=a;
既定義了一個(gè)有20個(gè)元素的一維整型數(shù)組;定義了一個(gè)整型指針變量;并將數(shù)組的首地址賦給這個(gè)指針變量。則(1)數(shù)組第i個(gè)元素的地址可以用下述方法表示:&a[i]或a+i或p+i;(2)數(shù)組第i個(gè)元素的值可以用下述方法表示:a[i]或p[i]或*(a+i)或*(p+i);
[例6-3]
假設(shè)有一個(gè)整型的a數(shù)組,共有20個(gè)元素。要求從鍵盤輸入這20個(gè)元素,并利用下標(biāo)法、數(shù)組名法和指針?lè)ǖ?種方法輸出數(shù)組中的各元素。
方法一:下標(biāo)法
main(){int
a[20],i;for(i=0;i<20;i++)scanf("%d",&a[i]);for(i=0;i<20;i++)printf("%d",&a[i]);}方法二:數(shù)組名法main(){int
a[20],i;for(i=0;i<20;i++)scanf("%d",a+i);for(i=0;i<20;i++)printf("%d",*(a+i));}方法三:指針?lè)╩ain(){inta[20],i,*p;p=a;for(i=0;i<20;i++)scanf("%d",p+i);pa=a;for(i=0;i<20;i++)printf("%d",*(p+i));}6.3.2指向二維數(shù)組的指針變量用指針處理一維數(shù)組時(shí),指針變量所指對(duì)象為數(shù)組元素,即指針變量增1、減1操作就使指針后移或前移一個(gè)數(shù)組元素。但是指針處理二維數(shù)組時(shí),指針變量所指對(duì)象是二維數(shù)組中的行,因此,無(wú)論從概念上還是使用上,二維數(shù)組的指針都要比一維數(shù)組的指針更加靈活。1.二維數(shù)組的地址
對(duì)二維數(shù)組a[3][4],
C語(yǔ)言將它視為有三個(gè)元素a[0]、a[1]、a[2]的一維數(shù)組(而每一個(gè)元素又是一個(gè)一維數(shù)組),
a代表整個(gè)二維數(shù)組的首地址。所以根據(jù)一維數(shù)組的表示方法,a+i代表第i個(gè)元素的地址(即第i行的首地址),a[i]和
*(a+i)表示它的第i個(gè)元素,但是這第i個(gè)元素又是一個(gè)一維數(shù)組,數(shù)組名就是這個(gè)數(shù)組的首地址,所以a[i]和
*(a+i)也代表第i個(gè)元素的地址(即第i行的首地址)。因此,對(duì)二維數(shù)組a[3][4]:(1)第i行的首地址可用下述方法表示:&a[i][0]或a+i或a[i]
或*(a+i);(2)第i行第j列的元素的地址可用下述方法表示:
&a[i][j]或(a+i)+j或a[i]+j
或*(a+i)+j
或a[0]+i*4+j等等;(3)第i行第j列的元素的值可用下述方法表示:
a[i][j]或*((a+i)+j)或*(a[i]+j)或*(*(a+i)+j);2.指向二維數(shù)組的指針變量
(1)指向數(shù)組元素的指針變量[例6-5]
用指針變量輸出二維數(shù)組元素的值。程序如下:main(){int
a[3][4]={{2,4,6,8},{10,12,14,16},{18,20,22,24}};int*p;/*定義一個(gè)指向整型變量的指針變量*/for(p=a[0];p<a[0]+12;p++){if((p-a[0])%4==0)
printf("\n");printf("%4d",*p);}}程序中用a[0]至a[0]+11表示各元素的地址。(2)指向一維數(shù)組的指針變量
把二維數(shù)組a分解為一維數(shù)組a[0]、a[1]、a[2]之后,設(shè)p為指向該一維數(shù)組的指針變量,可定義為:int(*p)[4];它表示p是一個(gè)指針變量,指向包含4個(gè)元素的一維數(shù)組。若p指向第一個(gè)一維數(shù)組a[0],其值等于a、a[0]或&a[0][0],而p+i則指向一維數(shù)組a[i]。從前面的分析可得出*(p+i)+j是二維數(shù)組第i行j列的元素的地址,而*(*(p+i)+j)則是第i行j列元素的值。
[例6-6]
輸出二維數(shù)組任一行任一列元素的值。main(){inta[2][3]={1,2,3,4,5,6};int(*p)[3],i,j;p=a;scanf("i=%d,j=%d",&i,&j);printf("a[%d][%d]=%d\n",i,j,*(*(p+i)+j));}程序運(yùn)行結(jié)果:輸入i=0,j=2回車,屏幕顯示:a[0][2]=36.3.3指針數(shù)組
當(dāng)一個(gè)數(shù)組的所有元素都是指針時(shí),它就是一個(gè)指針數(shù)組,即指針數(shù)組中的每一個(gè)元素都相當(dāng)于一個(gè)指針變量。一維指針數(shù)組的定義形式為:
類型名*數(shù)組名[數(shù)組長(zhǎng)度];例如:
inta[3][4]={2,4,6,8,10,12,14,16,18,20,22,24};int*p[3]={a[0],a[1],a[2]};/*為指針數(shù)組賦初值*/指針數(shù)組中的每個(gè)元素被賦予二維數(shù)組每一行的首地址。6.4指針與字符串C語(yǔ)言可以用字符指針來(lái)處理字符串。例如:char
str[30],*ps=str;又例如:char
*ps="Iamastudent!“;雖然用字符數(shù)組和字符指針變量都能實(shí)現(xiàn)字符串的存儲(chǔ)和運(yùn)算,但它們二者之間是有區(qū)別的,不能混為一談,主要區(qū)別有以下幾點(diǎn):(1)字符數(shù)組由若干個(gè)元素組成,每個(gè)元素中放一個(gè)字符,而字符指針變量中存放的是地址(即字符串的首地址)。(2)賦值方式不同。(3)字符指針變量的值是可以改變的,如下列程序:main(){char
*a="Iamastudent!";a=a+7;printf("%s",a);}程序運(yùn)行結(jié)果:
student!由程序可以看出,指針變量a的值可以變化,輸出字符串時(shí)從變化了的a值所指向的單元開始輸出各個(gè)字符,直到遇到字符串結(jié)束符‘\0’為止。而字符數(shù)組名雖然代表地址,但它的值是不能改變的。下面的寫法是錯(cuò)的:char
s[]="Iamastudent!";s=s+7;printf("%s\n",s);6.5指針與函數(shù)指針變量既可以指向整型變量、數(shù)組、字符串,也可以指向函數(shù)。一個(gè)函數(shù)被執(zhí)行時(shí),在內(nèi)存中占據(jù)一定的空間,這個(gè)空間的起始地址稱為函數(shù)的入口地址,用函數(shù)名表示。可以用指針變量指向這個(gè)入口地址,并通過(guò)該指針變量調(diào)用此函數(shù),這種指針變量稱為指向函數(shù)的指針。它定義的一般形式為:數(shù)據(jù)類型
(*指針變量名)();定義了函數(shù)指針后,就可以通過(guò)它來(lái)調(diào)用所指向的函數(shù)。在調(diào)用之前,必須先將函數(shù)的入口地址賦給該指針變量。由于函數(shù)名代表函數(shù)的入口地址,因此給函數(shù)指針變量賦值時(shí),只需給出函數(shù)名而不必給出參數(shù)。
[例6-9]
從鍵盤輸入10個(gè)數(shù),找出其中的最小值并輸出。程序如下:#include<stdio.h>intfmin(inta[],intn){inti,min;min=a[0];
for(i=1;i<n;i++)if(min>a[i])min=a[i];return(min);}main(){int(*p)();inti,mini,a[10];for(i=0;i<10;i++)scanf("%d",&a[i]);p=fmin;/*給指針變量賦初值*/mini=(*p)(a,10);/*調(diào)用由指針變量p指向的fmin()函數(shù),實(shí)參為a、10,得到的函數(shù)返回值賦給mini。*/
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 1.1《沁園春·長(zhǎng)沙》【中職專用】高一語(yǔ)文(高教版2023基礎(chǔ)模塊上冊(cè))
- 2023年浸漬、涂布或包覆處理紡織物項(xiàng)目融資計(jì)劃書
- 《法語(yǔ)學(xué)習(xí)課件》課件
- 《社會(huì)體育指導(dǎo)學(xué)》課件
- 養(yǎng)老院老人興趣小組活動(dòng)制度
- 養(yǎng)老院老人康復(fù)理療師培訓(xùn)制度
- 《g無(wú)線基礎(chǔ)知識(shí)》課件
- 國(guó)際經(jīng)濟(jì)與貿(mào)易課件
- 房屋租賃防火合同
- 2024年度綠色建筑節(jié)能改造示范項(xiàng)目土建施工分包合同2篇
- 2024年廣東廣州市荔灣區(qū)教育局招聘事業(yè)編制人員203人歷年(高頻重點(diǎn)復(fù)習(xí)提升訓(xùn)練)共500題附帶答案詳解
- JGJT397-2016 公墓和骨灰寄存建筑設(shè)計(jì)規(guī)范
- 2024版房產(chǎn)代持協(xié)議書樣本
- 某現(xiàn)澆鋼筋混凝土雙向板肋梁樓蓋設(shè)計(jì)計(jì)算書
- 八角購(gòu)銷合同范本
- 網(wǎng)課智慧樹知道《英美文學(xué)(山東第一醫(yī)科大學(xué))》章節(jié)測(cè)試答案
- 2024年廣東省廣州市荔灣區(qū)中考一模語(yǔ)文試題【含答案解析】
- 感統(tǒng)訓(xùn)練教育理念(3篇模板)
- 2024年公需課棗莊市繼續(xù)教育人社局題庫(kù)及答案18套題合集
- 生命哲學(xué):愛(ài)、美與死亡智慧樹知到期末考試答案章節(jié)答案2024年四川大學(xué)
- 地理信息 遙感影像傳感器及數(shù)據(jù)的定標(biāo)與驗(yàn)證 第3部分:SAR-InSAR
評(píng)論
0/150
提交評(píng)論