




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
六、指針與引用6.1指針的基本概念6.2指針與一維數(shù)組6.3堆內(nèi)存分配6.4字符指針6.5指針數(shù)組6.6引用的概念和操作(了解)6.7指針與二維數(shù)組(自主學(xué)習(xí))木紋背景的資料屬自主學(xué)習(xí)的內(nèi)容6.1指針的基本概念6.1.1變量的地址6.1.2指針變量6.1.3指針運算6.1.1變量的地址1、內(nèi)存的每個字節(jié)都有一個編號。這個編號就是這個字節(jié)對應(yīng)的內(nèi)存地址。2、程序中的每個數(shù)據(jù)都對應(yīng)著內(nèi)存中的一個地址,從該地址開始的一個或多個字節(jié)用來存放該數(shù)據(jù)。如:inti,j,k;i=3;j=6;3、內(nèi)存單元的地址和內(nèi)存單元的內(nèi)容的區(qū)別4、程序編譯后,變量名轉(zhuǎn)換為變量的地址,計算機通過內(nèi)存地址對變量進(jìn)行存取。5、變量的直接訪問和間接訪問直接訪問:通過變量的地址(變量名)存取變量。間接訪問:通過存放變量的地址的變量存取變量。6、”指向”的含義存放變量a的地址(&a)的變量指向變量a。1、變量的指針:即變量的地址。2、指針變量:專門用來存放另一個變量的地址的變量。指針變量的值(即指針變量中存放的值)是指針(地址)。3、聲明指針變量: 數(shù)據(jù)類型*變量;4、指針變量的初始化
inta=100; int*p=&a;5、指針變量的引用(取地址運算符&與指針運算符*)&只能作用于變量:&x,&a[5];//正確不能作用于常量、表達(dá)式:&25,&(i+1);//錯誤int*p;p=3000無意義intx,*p;x=p無意義4、有關(guān)說明 指針變量的地址,。。。6.1.2指針變量地址內(nèi)存數(shù)據(jù)區(qū)…20003整型變量a//inta=320046整型變量b//intb=620089整型變量c//intc=9…
…30002004指針變量p//int*p=&b;…當(dāng)前pb20046p++后pc20089p=p-2后pa200036.1.3指針運算算術(shù)運算:加法運算和減法運算關(guān)系運算:比較兩個指針變量賦值運算:6.2指針與數(shù)組(一維數(shù)組)
每個變量都有地址。 一個數(shù)組包含若干元素,每個數(shù)組元素都在內(nèi)存中占用存儲單元,它們也都有相應(yīng)的地址。指針變量既然可以指向變量,當(dāng)然也可以指向數(shù)組和數(shù)組元素(把數(shù)組起始地址或某一元素的地址放到一個指針變量中)。 所謂數(shù)組的指針是指數(shù)組的起始地址,數(shù)組元素的指針是數(shù)組元素的地址。數(shù)組,指針,循環(huán)語句三者是天生的好搭檔例如:inta[10];
//定義a為包含10個整型數(shù)據(jù)的數(shù)組int*p; //定義p為指向整型變量的指針變量p=&a[0];p++; //指向a[1]6.2.1指向數(shù)組元素的指針如果p的初值為&a[0],則:(1)p+i和a+i就是a[i]的地址,或者說,它們指向a數(shù)組的第i個元素,見圖。這里需要說明的是a代表數(shù)組首地址,a+i也是地址,它的計算方法同p+i,即它的實際地址為a+i×sizeof(int)。例如,p+9和a+9的值是&a[9],它指向a[9]。6.2.2通過指針訪問數(shù)組元素(2)*(p+i)或*(a+i)是p+i或a+i所指向的數(shù)組元素(的內(nèi)容),即a[i]。例如,*(p+5)或*(a+5)就是a[5]。即*(p+5)=*(a+5)=a[5]。實際上,在編譯時,對數(shù)組元素a[i]就是處理成*(a+i),即按數(shù)組首地址加上相對位移量得到要找的元素的地址,然后找出該單元中的內(nèi)容。 例如,若數(shù)組a的首地址為1000,設(shè)數(shù)組為int型,且sizeof(int)=4,則a[3]的地址是這樣計算出來的:
1000+3×4=1012,然后從1012地址所標(biāo)志的整型單元取出元素的值,即a[3]的值。可以看出,[]實際上是變址運算符,即將a[i]按a+i計算地址,然后找出此地址單元中的值。(3)指向數(shù)組的指針變量也可以帶下標(biāo),如p[i]與(p+i)等價。根據(jù)以上敘述,引用一個數(shù)組元素,可以用:下標(biāo)法,如a[i]形式;指針法,如*(a+i)或*(p+i)。其中a是數(shù)組名,p是指向數(shù)組的指針變量,其初值p=a。例:輸出數(shù)組元素。下標(biāo)法。通過數(shù)組名計算數(shù)組元素地址,找出元素的值。用指針變量指向數(shù)組元素。6.2.3舉例說明//例1intmain(){chara[13],*p=a;strcpy(a,“helloworld!”);cout<<a<<endl;inti,len=strlen(a);for(i=0;i<len;i++)cout<<a[i];for(i=0;i<len;i++)cout<<*(a+i);for(i=0;i<len;i++)cout<<*(p+i);for(p=a;p<a+len;p++)cout<<*p;return0;}//例2intmain(){inta[10],i,*p=a;for(i=0;i<10;i++)a[i]=i;//初始化for(i=0;i<10;i++)cout<<a[i]; for(i=0;i<10;i++)cout<<*(a+i);for(i=0;i<10;i++)cout<<*(p+i);for(p=a;p<a+10;p++)cout<<*p;return0;}//例3intmain(){char*p,*q;p=“helloworld!”;cout<<p<<endl;
inti,len=strlen(p);for(i=0;i<len;i++)cout<<*(p+i);for(q=p+len-1;q>=p;q--)cout<<*q;//逆向輸出return0;}6.3堆內(nèi)存分配6.3.1堆內(nèi)存6.3.2堆內(nèi)存操作函數(shù)6.3.3指針變量的空間申請和釋放6.3.4指針與函數(shù)6.3.1堆內(nèi)存
堆是程序運行時動態(tài)使用的一個內(nèi)存空間,要在堆中分配空間,必須使用特定的函數(shù),使用完成后必須及時釋放空間。6.3.2堆內(nèi)存操作函數(shù)(C語言的選擇)void*malloc(unsignedlongsize)voidfree(void*)頭文件為:alloc.h上面的堆內(nèi)存操作函數(shù)在C++中不太常用!使用new分配內(nèi)存空間使用delete釋放內(nèi)存空間例如:intmain(){
int*p=newint[10]; //申請空間
inti,sum=0; for(i=0;i<10;i++) p[i]=i; for(i=0;i<10;i++) sum+=p[i]; cout<<sum<<endl;
delete[]p; //釋放空間,注意不要忘了中括號
return0;}6.3.3指針變量的空間申請和釋放6.3.4指針與函數(shù)指針或變量的地址作為函數(shù)參數(shù)指針函數(shù)(課后了解)函數(shù)指針(課后了解)例:使用指針作為參數(shù),設(shè)計函數(shù),參數(shù)為a,b,c3個整型變量的地址,執(zhí)行函數(shù)后,實現(xiàn)a≤b≤c。intmain(){ inta=3,b=125,c=38; int*pa=&a,*pb=&b,*pc=&c;
fun(pa,pb,pc); //使用指針作為參數(shù)
cout<<“a=“<<a<<“,b=“<<b<<“,c=“<<c<<endl; a=3;b=125;c=38;
fun(&a,&b,&c); //使用地址作為參數(shù)
cout<<“a=“<<a<<“,b=“<<b<<“,c=“<<c<<endl; return0;}輸出結(jié)果為:a=3,b=38,c=125a=3,b=38,c=125voidfun(int*pa,int*pb,int*pc){ intx;
if(*pa>*pb){x=*pa;*pa=*pb;*pb=x;} if(*pb>*pc){x=*pc;*pc=*pb;*pb=x;} if(*pa>*pb){x=*pa;*pa=*pb;*pb=x;}}6.4字符指針6.4.1字符指針的使用6.4.2字符指針與字符數(shù)組的區(qū)別舉例:charstr[6]=“China”,c;char*p,*q;p=str;q=&c;strcpy(str,“Hello”);//正確//下列語句有潛在風(fēng)險strcpy(str,“Helloworld!”);//風(fēng)險舉例inta=100;charstr[6]=“China”;strcpy(str,“Helloworld!”);cout<<a<<endl;
運行結(jié)果:5602294906.4.1字符指針的使用另外,常用的可行方法:charstr[6]=“China”;strings1=str;//此時s1和str占據(jù)2塊不同的內(nèi)存區(qū)域s1=“Helloworld”;//正確strings2=“Helloworld”;//方法c_str()將string強制轉(zhuǎn)換成c格式的字符串char*p=(char*)s2.c_str();cout<<p<<endl;6.4.2字符指針與字符數(shù)組的區(qū)別概念
數(shù)組是一個整體,指針只是地址賦值方式:charstr[20],*p;strcpy(str,“helloworld”):p=“helloworld”;內(nèi)存分配方式: 數(shù)組空間在編譯時分配,指針的指向運行時確定能否賦值數(shù)組名是常量(即數(shù)組首地址),不能對數(shù)組名賦值指針可以直接賦值6.5指針數(shù)組指針數(shù)組的簡單介紹6.6引用的概念和操作(不作要求,了解)6.6.1引用的概念6.6.2引用的操作6.6.3引用的說明6.6.1引用的概念在C++中,引用提供了一種把實體的變量作為該實體的別名的機制。通俗地說,引用即給對象起“別名”。引用運算符是“&”。“&”在定義時出現(xiàn)在賦值運算符的左邊表示是“引用”,否則是取址符;一個對象一旦有了別名,此別名就不能再作為別的對象的別名,所以聲明時必須進(jìn)行初始化;有了別名的對象,不管對真名、還是對別名進(jìn)行操作,都是對此對象進(jìn)行操作;一個被聲明成引用的變量,并不另外再占有存儲空間。6.6.2引用的操作用引用傳遞函數(shù)的參數(shù)利用引用返回多個值
(把需要返回的多個值的引用作為函數(shù)的參數(shù))例:設(shè)計函數(shù),參數(shù)為a,b,c3個整型變量,執(zhí)行函數(shù)后,滿足a≤b≤c(用引用傳遞函數(shù)的參數(shù))voidf2(int&a,int&b,int&c){ intx;
if(a>b){x=a;a=b;b=x;} if(b>c){x=c;c=b;b=x;} if(a>b){x=a;a=b;b=x;}}intmain(){ intx1=3,x2=125,x3=38;
int&p1=x1,&p2=x2,&p3=x3; //此處定義了3個引用
f2(p1,p2,p3);//使用引用作為參數(shù)
//f2(x1,x2,x3);//使用傳統(tǒng)的傳地址方式(其本質(zhì)就是引用) cout<<“x1=“<<x1<<“,x2=“<<x2<<“,x3=“<<x3<<endl; return0;}輸出結(jié)果為:x1=3,x2=38,x3=125例:利用引用返回多個值由于引用能夠改變參數(shù)的值,因此利用這個特點就可以實現(xiàn)返回多個值。voidfun(intn,int&a,int&b){ a=n*n; b=n*n*n; }intmain(){ intx,y,z; cin>>x; fun(x,y,z); cout<<x<<","<<y<<","<<z<<endl; return0;}6.6.3引用的說明引用在聲明的時候必須同時要初始化,否則會出現(xiàn)錯誤。引用是從一而終的,在初始化后不會再指向其他的變量。任何對該引用的賦值都是對引用所維系的目標(biāo)賦值,而不是將引用維系到另一個目標(biāo)上。由于引用本身不是類型,所以沒有引用的指針和引用的引用。但可以有指針的引用。用引用傳遞函數(shù)參數(shù)與指針的效果一樣,傳遞的是原來的變量或?qū)ο螅皇窃诤瘮?shù)作用域內(nèi)建立副本。可以利用引用返回多個值 shortinta[3][4]={ {1,3,5,7},
{9,11,13,15},
{17,19,21,23}}; a是一個數(shù)組名。a數(shù)組包含3行,即3個元素:a[0],a[1],a[2]。而每一元素又是一個一維數(shù)組,它包含4個元素(即4個列元素),例如,a[0]所代表的一維數(shù)組又包含4個元素:a[0][0],a[0][1],a[0][2],a[0][3],見下圖。6.7指針與二維數(shù)組(自主學(xué)習(xí))本節(jié)內(nèi)容相對較難理解,建議通過實踐來幫助理解
從二維數(shù)組的角度來看,a代表整個二維數(shù)組的首地址,也就是第0行的首地址。a+1代表第1行的首地址。如果二維數(shù)組的首地址為2000,則a+1為2008,因為第0行有4個short型數(shù)據(jù),因此a+1的含義是a[1]的地址,即a+4×2=2008。a+2代表第2行的首地址,它的值是2016,見下圖。
a[0]、a[1]、a[2]既然是一維數(shù)組名,而C/C++語言又規(guī)定了數(shù)組名代表數(shù)組的首地址,因此a[0]代表第0行一維數(shù)組中第0列元素的地址,即&a[0][0]。a[1]的值是&a[1][0],a[2]的值是&a[2][0]。
第0行第1列元素的地址怎么表示? 可以用a[0]+1來表示。
此時“a[0]+1”中的1代表1個列元素的字節(jié)數(shù),即2個字節(jié)。今a[0]的值是2000,a[0]+1的值是2002(而不是2008)。這是因為現(xiàn)在是在一維數(shù)組范圍內(nèi)討論問題的,正如有一個一維數(shù)組x,x+1是其第1列元素地址一樣。a[0]+0、a[0]+1、a[0]+2、a[0]+3分別是a[0][0]、a[0][1]、a[0][2]、a[0][3]的地址。
前已述及,a[0]和*(a+0)等價,a[1]和*(a+1)等價,a[i]和*(a+i)等價。因此,a[0]+1和*(a+0)+1的值都是&a[0][1](即右圖中的2002)。a[1]+2和*(a+1)+2的值都是&a[1][2](即右圖中的2012)。請注意不要將*(a+1)+2錯寫成*(a+1+2),后者變成*(a+3)了,相當(dāng)于a[3]。
進(jìn)一步分析,欲得到a[0][1]的值,用地址法怎么表示呢?既然a[0]+1和*(a+0)+1是a[0][1]的地址,那么,*(a[0]+1)就是a[0][1]的值。同理,*(*(a+0)+1)或*(*a+1)也是a[0][1]的值。*(a[i]+j)或*(*(a+i)+j)是a[i][j]的值。務(wù)請記住*(a+i)和a[i]是等價的。 有必要對a[i]的性質(zhì)作進(jìn)一步說明。a[i]從形式上看是a數(shù)組中第i個元素。如果a是一維數(shù)組名,則a[i]代表a數(shù)組第i個元素所占的內(nèi)存單元。a[i]是有物理地址的,是占內(nèi)存單元的。但如果a是二維數(shù)組,則a[i]是代表一維數(shù)組名。a[i]本身并不占內(nèi)存單元,它也不存放a數(shù)組中各個元素的值。它只是一個地址(如同一個一維數(shù)組名x并不占內(nèi)存單元而只代表地址一樣)。a、a+i、a[i]、*(a+i)、*(a+i)+j、a[i]+j都是地址。*(a[i]+j)、*(*(a+i)+j)是二維數(shù)組元素a[i][j]的值。
為什么a+1和*(a+1)都是2008呢?a+1的值和a+1的地址怎么都是一樣的呢? 的確,二維數(shù)組中有些概念比較復(fù)雜難懂,要反復(fù)思考。首先說明,a+1是地址(指向第1行首地址),而*(a+1)并不是“a+1單元的內(nèi)容(值)”,因為a+1并不是一個實際變量,也就談不上它的內(nèi)容。*(a+1)就是a[1],而a[1]是一維數(shù)組名,所以也是地址。以上各種形式都是地址計算的不同表示。 為了說明這個容易搞混的問題,舉例子來說明。 有一個排,下設(shè)3個班,每班有10名戰(zhàn)士。規(guī)定排長只管理到班,班長管理戰(zhàn)士。在排長眼里只有第0、1、2班(為與C/C++語言中數(shù)組下標(biāo)一致,假定班號也從0開始)。排長從第0班的起始位置走到第1班的起始位置,看來只走了一步,但實際上它跳過了10個戰(zhàn)士。這相當(dāng)于a+1(見后圖)。為了找到某一班內(nèi)某一個戰(zhàn)士,必須給兩個參數(shù),即第i班第j個戰(zhàn)士,先找到第i班,然后由該班班長在本班范圍內(nèi)找第j個戰(zhàn)士。這個戰(zhàn)士的位置就是a[i]+j(這是一個地址)。開始時班長面對第0個戰(zhàn)士。注意,排長和班長的初始位置是相同的(如圖中的a和a[0]都是2000)。但它們的“指向”是不同的。
排長“指向”班,他走一步就跳過1個班,而班長“指向”戰(zhàn)士,走一步只是指向下一個戰(zhàn)士。可以看到排長是“宏觀管理”,只管班,在圖中是控制縱向,班長則是“微觀管理”,管理到戰(zhàn)士,在圖上是控制橫向。如果要找第1班第2個戰(zhàn)士,則先由排長找到第1班的班長,然后,由班長在本班范圍內(nèi)找到第2個戰(zhàn)士。二維數(shù)組a相當(dāng)于排長,每一行(即一維數(shù)組a[0]、a[1]、a[2])相當(dāng)于班長,每一行中的元素(如a[1][2])相當(dāng)于戰(zhàn)士。a+1與a[0]+1是不同的,a+1是第1行的首地址,a+1指向第1行(相當(dāng)于排長走到第1班的開頭),而*(a+1)或a[1]或a[1]+0都指向第1行第0列元素(相當(dāng)于第1班第0個戰(zhàn)士),二者地址雖相同,但含義不同了
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 租賃合同的履行評估與績效指標(biāo)考核試卷
- 輔具適配的長期照護(hù)體系融合考核試卷
- 金屬結(jié)構(gòu)在市政工程中的應(yīng)用考核試卷
- 2024年袋裝腹膜透析液項目資金申請報告代可行性研究報告
- 智能家居產(chǎn)品體驗店投資合作框架協(xié)議
- 生物實驗室潔凈室租賃及技術(shù)支持協(xié)議
- 2025年中國筆記本電腦散熱座臺行業(yè)市場前景預(yù)測及投資價值評估分析報告
- 2025年中國保濕美容儀行業(yè)市場前景預(yù)測及投資價值評估分析報告
- 網(wǎng)絡(luò)店鋪數(shù)據(jù)安全保護(hù)與責(zé)任承擔(dān)協(xié)議
- 抖音短視頻內(nèi)容爭議仲裁服務(wù)協(xié)議
- GB/T 3917.2-2009紡織品織物撕破性能第2部分:褲形試樣(單縫)撕破強力的測定
- GB/T 27024-2014合格評定人員認(rèn)證機構(gòu)通用要求
- 鋼箱梁焊接作業(yè)指導(dǎo)書
- GB 34660-2017道路車輛電磁兼容性要求和試驗方法
- BB/T 0034-2017鋁防盜瓶蓋
- 國家義務(wù)教育質(zhì)量監(jiān)測科學(xué)模擬測試題附答案
- 12-1限度樣品管理辦法
- UI界面設(shè)計交互設(shè)計教學(xué)
- 鋼箱梁計算分析與案例詳解
- 絞肉機的設(shè)計本科生畢業(yè)論文
- 山東省某房地產(chǎn)開發(fā)項目建設(shè)節(jié)能評估報告
評論
0/150
提交評論