版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
C-LANGUAGE第八章指針指針的概念⒈指針可以理解為地址,一個變量在內(nèi)存單元的首地址稱為該變量的“指針”,通過變量指針可以找到該變量所占用的內(nèi)存單元。⒉指針變量,即專門用來存放內(nèi)存地址的變量。也就是說,如果有一個變量專門用來存放另一變量的地址(即指針),則它稱為“指針變量”。指針是一個地址,而指針變量是存放地址的變量。⒊指針變量的定義形式為:類型名*指針變量名;e.g.int*p,*q;說明:①指針變量的類型名用來指定該指針變量可以指向的變量的類型。2指針的概念②在定義指針變量時必須指定類型名。一個指針變量只能指向同一類型的變量,不能忽而指向一個整型變量,忽而指向一個實(shí)型變量。③指針變量前面的“*”表示該變量的類型為指針型變量。④在定義指針變量時必須指定類型名,如果指針是指向一個整型變量,那么“使指針移動1個位置”意味著移動4個字節(jié),“使指針加1”意味著使地址值加4個字節(jié)。⒋指針變量的引用說明:C語言中對指針變量的引用是通過“&”和“*”兩個運(yùn)算符實(shí)現(xiàn)的。其中,&是取地址符。
它的一般格式為:&變量名*是取值運(yù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),分別代表兩種不同的含義。在定義變量時,“*”只起標(biāo)記作用,用來說明所定義的變量是指針變量。在非定義狀態(tài)下,“*”是間接訪問運(yùn)算符,用來獲取指針變量所指向變量的內(nèi)容。表示p是指向整型變量的指針變量表示通過取地址符&將變量x的地址賦給指針變量p表示把p所指向的變量的值賦給y4指針的概念⒌指針變量的初始化指針變量在使用之前必須對其進(jìn)行初始化,使指針變量指向一個確定的內(nèi)存單元。一般形式為:
類型說明符*指針變量名=初始地址值;e.g.inta=10;int*p=&a;note:①任何指針變量在使用之前都要進(jìn)行定義并賦值,未經(jīng)賦值的指針變量是禁止使用的。②在初始化指針時,要注意類型匹配的問題,也就是說,必須是同一類型數(shù)據(jù)的地址才能進(jìn)行指針初始化。③可以把一個指針的值賦給另一個指針,但不能直接用整型數(shù)據(jù)賦值給指針變量。5指針的概念⒍指針的運(yùn)算在C語言程序中,指針只能進(jìn)行賦值運(yùn)算,部分算術(shù)運(yùn)算及關(guān)系運(yùn)算。⑴賦值運(yùn)算說明:指針變量的賦值運(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指針的概念說明:Null是一個符號常量,在stdio.h頭文件中有對它的定義。將指針變量賦值為Null,表示該指針變量當(dāng)前未指向任何變量,其值為0.note:給指針變量賦0值和不賦值是不同的。指針變量未賦值時,程序編譯時分配給指針變量的存儲空間中的值是不確定的,可以是任何值,直接使用該指針變量有可能造成錯誤。而指針變量被賦Null值后,值是確定的,則可以使用,只是它未指向具體的變量。⑵算術(shù)運(yùn)算描述:主要是對指針變量加上或減去一個整數(shù),這樣會使指針變量指向相鄰的存儲單元,即指針的移動。只有指針變量指向一片連續(xù)的存儲單元時,指針的移動才有意義。7指針的概念e.g.在內(nèi)存中有一片地址連續(xù)的存儲單元,基本類型為int類型的指針變量p指向地址為1000的存儲單元,若執(zhí)行操作p=p+1;則指針變量p指向首地址為1004的存儲單元。note:指針變量p的基本類型為int,移動一個存儲單元的長度就是移動4個字節(jié)。因此,對指針變量進(jìn)行加減運(yùn)算時,數(shù)字“1”不再代表十進(jìn)制整數(shù)”1“,而是指一個存儲單元長度。⑶關(guān)系運(yùn)算描述:其實(shí)就是比較地址值的大小。設(shè)p、q是指向同一數(shù)據(jù)集合的指針變量,若p>q的值為真,則表明p指針變量所指向的元素在q指針變量所指向的元素之后。像p>=q,p<=q,p==q,p!=q都是用來判斷同一數(shù)據(jù)集合中元素的位置關(guān)系的。⑷兩指針變量相減變量值之差是兩個指針間元素的個數(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ù)存儲的,所以任何用數(shù)組下標(biāo)完成的操作都可以通過指針的移動來實(shí)現(xiàn)。⒈指針與一維數(shù)組一維數(shù)組中,第一個元素的地址即為該數(shù)組的起始地址,即首地址。⑴指針變量與一維數(shù)組的聯(lián)系①指針變量指向的是元素地址。在數(shù)組中,數(shù)組名即代表數(shù)組的首地址,如果需要指針指向數(shù)組,直接將數(shù)組名賦予指針變量即可。e.g.inta[6],*pa;pa=a;或pa=&a[0];說明:由于數(shù)組名a代表該數(shù)組的首地址,即a[0]的地址,因此指針變量pa保存了該數(shù)組的首地址,此時,pa,a,&a[0]均指向同一內(nèi)存單元。10指針與數(shù)組②也可在定義指針變量時直接對其初始化。e.g.inta[10],*pa=a;③程序設(shè)計中,可以在指針變量定義后讓指針變量指向某一個數(shù)組元素地址。e.g.pa=&a[3];note:數(shù)組名a是一個地址常量,它永遠(yuǎn)指向a數(shù)組的首地址,因此不能對a進(jìn)行重新賦值。⑵用指針訪問數(shù)組元素在對數(shù)組元素引用時是通過數(shù)組名和一對方括號來完成。①通過指針引用數(shù)組元素e.g.int*p,a[5];P=&a[0];指針變量p指向數(shù)組元素a[0],因此可使用訪問運(yùn)算符”*“來引用變量a[0].e.g.*p=1811指針與數(shù)組②若p的初值為&a[0],則ⅰ)p+i和a+i就是a[i]的地址,或者說它們指向a數(shù)組的第i個元素。ⅱ)*(p+i)或*(a+i)就是p+i或a+i所指向的數(shù)組元素,即a[i]。即按數(shù)組首元素的地址加上相對位移量得到要找的元素的地址,然后找出該單元中的內(nèi)容。③p[i]與*(p+i)等價④要注意指針變量的當(dāng)前值⑤注意指針變量的運(yùn)算(使p指向數(shù)組a的首元素)ⅰ)p++(或p+=1),使p指向下一元素,即a[1],*p,取a[1]的值。ⅱ)*p++等價于*(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)出錯答案:C13指針與數(shù)組⑶用數(shù)組名作函數(shù)參數(shù)①數(shù)組元素作實(shí)參——”值傳遞“方式②用數(shù)組名作函數(shù)參數(shù)實(shí)參數(shù)組名代表該數(shù)組首元素的地址,而形參是用來接收從實(shí)參傳遞過來的數(shù)組首元素地址的。note:Ⅰ)當(dāng)用變量名作為函數(shù)參數(shù)時傳遞的是變量的值,當(dāng)用數(shù)組名作為函數(shù)參數(shù)時,由于數(shù)組名代表的是數(shù)組首元素的地址,因此傳遞的值是地址,所以要求形參為指針變量或形參數(shù)組。Ⅱ)形參數(shù)組從實(shí)參數(shù)組那里得到起始地址,因此形參數(shù)組與實(shí)參數(shù)組共同占一段內(nèi)存單元,在調(diào)用函數(shù)期間,如果改變了形參數(shù)組的值,也就改變了實(shí)參數(shù)組的值。14指針與數(shù)組③如果有一個實(shí)參數(shù)組,要想在函數(shù)中改變此數(shù)組中的元素的值,實(shí)參與形參的對應(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];①任何一個二維數(shù)組都由若干個一維數(shù)組組成。C語言允許把一個二維數(shù)組分解為多個一維數(shù)組來處理。因此數(shù)組a可以理解為由兩個一維數(shù)組組成,即數(shù)組a由a[0]、a[1]兩個元素組成,a是二維數(shù)組名,而每個元素又各自含有3個元素。a[0]、a[1]既然是一維數(shù)組名,而C語言規(guī)定數(shù)組名代表數(shù)組的首地址,則a[0]代表數(shù)組元素a[0][0]的地址,即&a[0][0].a[1]的值為&a[1][0]。②二維數(shù)組名是一個地址常量note:①對于二維數(shù)組名a,也不可以進(jìn)行a++、a=a+i;之類賦值運(yùn)算。②在二維數(shù)組中,a的值與a[0]的值相同,但是基本類型不同。a等價于一個二維指針,而a[0]是一個一維指針,因此,以下賦值是不正確的。
inta[3][4]={0},*p;p=a;19指針與數(shù)組③a指針的基類型是擁有3個元素的一維數(shù)組,地址a+1表示的是a[1]的地址,a+2表示的是a[2]的地址,所以a+i與&a[i]等價,*(a+i)與a[i]等價。⑵二維數(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ù)組說明:Ⅰ)在指向行的指針前面加一個“*”,就轉(zhuǎn)換為指向列的指針。反之,在指向列的指針前面加“&”,就成為指向行的指針。Ⅱ)*(a+i)只是a[i]的另一種表示形式,不要簡單的認(rèn)為*(a+i)是a+i所指單元中的內(nèi)容,在一維數(shù)組中a+i所指的是一個數(shù)字元素的存儲單元。在該單元中有具體的值,而對二維數(shù)組,a+i不是指向具體存儲單元而指向行。練習(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];解釋:定義了一個具有3個元素的一維數(shù)組,每個元素都只能存放指針,這些指針的基本類型都必須為整型,故稱p為指針數(shù)組。說明:[]的優(yōu)先級高于*,因此p先與[]結(jié)合,構(gòu)成p[3],說明p是個數(shù)組名,在它前面的*號,說明數(shù)組p中的每個元素只能存放指針。p[0]p[1]p[2]23指針與數(shù)組可以通過指針數(shù)組p來引用a數(shù)組元素,等價如下ⅰ)*(p[i]+j)與*(a[i]+j)對應(yīng)ⅱ)*(*(p+i)+j))與*(*(a+i)+j)對應(yīng)ⅲ)(*(p+i))[j]與*(*(a+i))[j]對應(yīng)ⅳ)p[i][j]與a[i][j]對應(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];解釋:定義了一個指針變量p,p只能存放含有兩個整型元素的一維數(shù)組的首地址。note:p并不是一個含有兩個元素的一維數(shù)組。說明:()的優(yōu)先級高于[],因此p先與*結(jié)合,說明p是一個指針變量,在它后面的[2]則說明指針p的基類型為2個整型元素,所以p+1不是讓指針p移動一個整型大小,而是移動兩個整型大小。⑤指針數(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”,這樣就可以通過指針p來處理字符串“China”。
charstr[1O];str=“China”;⒉訪問一個字符串的兩種方法e.g.char*string=“IloveChina!”;等價于char*string;string=“IloveChina!”;這是錯誤的賦值用字符數(shù)組存放一個字符串,然后輸出用字符指針指向一個字符串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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 感謝老師的發(fā)言稿15篇
- 心理健康觀后感
- 易錯題31 語言文字運(yùn)用之詞語效果題-不結(jié)合文意分析詞語效果高考語文備戰(zhàn)2025年高考易錯題(新高考專用)含解析
- 愚人節(jié)日記資料
- 怦然心動觀后感(集合15篇)
- 投資管理公司介紹
- 怦然心動觀后感6篇
- 初級會計經(jīng)濟(jì)法基礎(chǔ)-初級會計《經(jīng)濟(jì)法基礎(chǔ)》點(diǎn)睛試卷13
- 中國發(fā)光二極管(LED)行業(yè)市場發(fā)展前景研究報告-智研咨詢發(fā)布
- 智研咨詢發(fā)布:2024年中國異丙醇行業(yè)競爭格局及發(fā)展前景研究報告
- 2025年度廚師職業(yè)培訓(xùn)學(xué)院合作辦學(xué)合同4篇
- 《組織行為學(xué)》第1章-組織行為學(xué)概述
- 市場營銷試題(含參考答案)
- 2024年山東省泰安市高考物理一模試卷(含詳細(xì)答案解析)
- 護(hù)理指南手術(shù)器械臺擺放
- 腫瘤患者管理
- 四川省成都市高新區(qū)2024年七年級上學(xué)期語文期末試卷【含答案】
- 2025年中國航空部附件維修行業(yè)市場競爭格局、行業(yè)政策及需求規(guī)模預(yù)測報告
- 國土空間生態(tài)修復(fù)規(guī)劃
- 1-1《送瘟神》課件-高教版中職語文職業(yè)模塊
- (高清版)DZT 0399-2022 礦山資源儲量管理規(guī)范
評論
0/150
提交評論