




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第五章指針和引用.指針是一種特殊的數(shù)據(jù)類型。指針概念是C++語言中較難理解和較難掌握的概念之一。本章介紹指針的概念、定義、運算等內(nèi)容。
指針變量是一種特殊的變量,變量中存放的不是某種數(shù)據(jù)類型的數(shù)據(jù),而是另一個變量或常量的地址。§5.1指針概念如有定義:intvalue=150;charch=‘M’;并執(zhí)行賦值語句:pv=&value;pc=&ch;//pvholdstheaddressofvalue由于pv中存放的是value變量的地址,pc中存放的是ch變量的地址,故稱pv和pc為指針變量。簡稱為指針〔Pointer〕。.指針指向的對象稱為目標或目標變量〔常量〕。如圖7.1所示:…150…‘M’…
…valuechpvpc*pv*pc圖1內(nèi)存空間1000H1050H0000H&value1000H1001H&ch1050H&pc11A2H11A3H11A1H&pv11A0H.C++規(guī)定:目標或目標變量可以用指針變量名前加上運算符“*〞表示。pv的目標變量value可表示為*pv,pc的目標變量ch可表示為*pc,即*pv和value等效*pc和ch等效而&pv和&pc表示針變量本身的地址,當(dāng)指針變量為2個字節(jié)時,最大訪問地址為:指針的定義指針變量也必須先定義后使用定義的一般格式:類型定義符*指針變量名;其中:類型定義符——指針指向?qū)ο蟮臄?shù)據(jù)類型“*〞——說明符,表示其后的標識符是指針變量,而不是一般變量。.例如:
int*ptr;char*name;float*pf;其中,定義ptr,name,pf分別為指向整型、字符型和浮點型數(shù)據(jù)的指針。
constint*ptr;//pointertointconstconstchar*cpcconstfloat*point其中,ptr,cpc,point為指向常量的指針。注意:指針變量可以與其他變量一起定義,如:
inta,bb,*c;char*p,*q,ch;指針變量也可定義為全局,靜態(tài)和局部的指針。.例如:intnum,*pn;charcolor,*pc;執(zhí)行語句pn=#pc=&color;那么在程序中*pn=100;等效于num=100;*pc=‘r’;等效于color=‘r’;這里,“*〞作為訪問目標變量的運算符,在定義指針時,“*〞作為說明符。注意使用上的區(qū)別?!?.2指針賦值使用指針前,必須給已定義指針變量賦以指向目標變量的地址值?!?〞操作符可獲取變量的地址。.指針賦值的幾種情況:同種數(shù)據(jù)類型的指針變量之間可以相互賦值。
inta,*pa,*pb;pa=&a;pb=pa;//pa,pbholdsthesameaddressofa指針變量可以賦初值:
inta,b,c;int*pa=&a,*pc=&c;指針可初始化為空指針
char*p=NULL;指針變量的類型名與指向目標的數(shù)據(jù)類型一致。
例如:
int*p,a;floatb,*q;p=&b;q=&a;//錯誤
p=&a;q=&b;//正確.例:有關(guān)指針概念的程序//ex5_3.cpp#include<iostream.h>voidmain(){intw,*p=&w;*p=800;cout<<"w="<<w<<'\t'<<"&w="<<&w<<endl;cout<<"*p="<<*p<<'\t'<<"&p="<<&p<<endl;cout<<'\t'<<"p="<<p<<endl;}結(jié)果:
w=800&w=0x0012FF7C*p=800&p=0x0012FF78p=0x0012FF7C指針變量的地址指針也是變量,指針變量的地址是指它本身的內(nèi)存地址,如圖1所示。.圖示如下:0012:FF7C(&w)800pw0012:FF7C*p0012:FF78(&p)§5.3指針運算指針運算實質(zhì)上是地址運算。1、賦值運算2、取地址運算“&〞〔addressof〕和取內(nèi)容運算“*〞〔Dereference〕,“&〞和“*〞互為逆運算,例如:intx,*ptr=&x;那么&(*ptr)表示指針ptr*(&x)表示變量x圖2.3、指針與整數(shù)的加減運算在數(shù)組中,指針變量加上或減去一個整數(shù)n,表示:指針由當(dāng)前所指向的位置向前或向后移動n個數(shù)據(jù)元素的位置。移動后的實際地址為:p±n*sizeof(數(shù)據(jù)類型)4、指針的關(guān)系運算指向同種數(shù)據(jù)類型的指針可作關(guān)系運算,表示它們所存放的地址之間的關(guān)系。<,>,==,!=指針運算例如:課本P57例4.2.//ex5_2a.cpp#include<iostream.h>voidmain(){ inta[10],*p,*q; cout<<"a="<<a<<endl; cout<<"a+1="<<a+1<<endl; cout<<"a+2="<<a+2<<endl; p=&a[5]; q=p; p++; q--;
cout<<"p="<<p<<endl;cout<<"q="<<q<<endl;p=&a[2];q=&a[6];cout<<"q-p="<<q-p<<endl;cout<<"p="<<p<<endl;cout<<"q="<<q<<endl;cout<<"p+4="<<p+4<<endl;}.例//ex5_3.cpp#include<iostream.h>voidmain(){ char*p1,*p2; p1="CProgram"; p2=p1+8; while(p2>=p1) { cout<<*p2; p2--; } cout<<endl;}'m''a'…'r''g''o''r''P''''C'…p1p2.§5.4指針與數(shù)組C++規(guī)定定義一個數(shù)組時,用數(shù)組名存放該數(shù)組在內(nèi)存中的首地址。
當(dāng)把數(shù)組名賦予一個指針變量后,該指針指向數(shù)組,可以通過指針移動方式訪問數(shù)組元素。
例如:inta[20],*p;p=a;那么下標為i的元素可表示為:a[i],*(a+i),p[i],*(p+i),對應(yīng)地址可表示為:&a[i],a+i,&p[i],p+i注意:數(shù)組名是指針常量,不是指針變量,不能給數(shù)組名賦值。.數(shù)組元素的表示方法例如.例如:下面程序是用指針方式訪問數(shù)組元素,計算數(shù)組元素之和。
#include<iostream.h>voidmain(){intiarray[10]={0,2,4,6,8,10,12,14,16,18};intsum=0;int*iptr=iarray;//指針初始化for(inti=0;i<10;i++){sum+=*iptr;iptr++;}cout<<“sumis“<<sum<<endl;}運行結(jié)果為:sumis90.例如:對于前例中數(shù)組的求和元素運算,可以有以下五種方法:#include<iostream.h>intsum1,sum2,sum3,sum4,sum5;intiarray[]={1,4,2,7,13,32,21,48,16,30};int*iptr;voidmain(){intsize,n;size=sizeof(iarray)/sizeof(*iarray);for(n=0;n<size;n++)//方法1{sum1+=iarray[n];}.
iptr=iarray;//方法2for(n=0;n<size;n++)
{sum2+=*iptr++;
}iptr=iarray;//方法3for(n=0;n<size;n++)
{sum3+=*(iptr+n);
}iptr=iarray;//方法4for(n=0;n<size;n++)
{sum4+=iptr[n];
}for(n=0;n<size;n++)//方法5
{sum5+=*(iarray+n);
}cout<<sum1<<endl;cout<<sum2<<endl;cout<<sum3<<endl;cout<<sum4<<endl;cout<<sum5<<endl;}答案為:174174174174174.一、字符數(shù)組數(shù)組中每個元素為字符的數(shù)組稱為字符數(shù)組,字符數(shù)組可用單個字符常量初始化,也可用字符串常量初始化,例如:charbuffer[]=“hello〞;二、字符串常量在C++中,字符串常量是由雙引號括起的一串字符。字符串常量通常存放在dataarea的const區(qū)中,并以‘\0’作為結(jié)束符,編譯器記下其起始地。即:地址代表了這個字符串常量。由于字符串常量的地址屬性,所以由相同字符組成的字符串常量是兩個不同起始地址的字符串常量。§5.5字符指針.三、字符指針指向字符類型的指針稱為字符指針。字符串常量和字符數(shù)組名都具有地址特性,當(dāng)把它們賦給一個字符指針后,編譯器規(guī)定:輸出字符指針就是輸出字符串;輸出字符指針指向的對象,就是輸出單個字符。.例如:#include<iostream.h>voidmain(){charbuffer[10]=“ABC〞;char*pc;pc=“hello〞;cout<<pc<<endl;//輸出hellopc++;cout<<pc<<endl;//輸出ellocout<<*pc<<endl;//輸出epc=buffer;cout<<pc;//輸出ABC}.四、字符串比較字符串比較是指兩個字符串進行逐個字符的一一比較。通常使用在string.h頭文件中定義的strcmp()函數(shù),其原型為:intstrcmp(constchar*str1,constchar*str2);其返回值:(1)當(dāng)str1串等于str2串時,返回值0;(2)當(dāng)str1串大于str2串時,返回一個正值;(3)當(dāng)str1串小于str2串時,返回一個負值。.五、字符串賦值C++中,可以使用在string.h中定義的標準函數(shù)strcpy()對字符數(shù)組進行賦值。函數(shù)原型為:char*strcpy(char*dest,constchar*src);返回值為dest值。例如:charbuffer1[10];charbuffer2[10];strcpy(buffer1,〞hello〞);strcpy(buffer2,buffer1);字符串常量“hello〞賦給字符數(shù)組buffer2。.一、定義一個數(shù)組中假設(shè)每個元素都是一個指針,那么稱為指針數(shù)組。例如:定義一個指針數(shù)組并初始化char*proname[]={“FORTRAN〞,“C〞,“C++〞};該數(shù)組的每個元素是指向字符串常量的字符指針,指針指向的字符串常量存放在dataarea的const存儲區(qū)中,可能連續(xù),也可能不連續(xù)。§5.6指針數(shù)組.該字符數(shù)組的內(nèi)存表示如下:0088:22510088:22590088:225B0067:44000067:44020067:44040088:2251‘F’‘O’‘R’‘T’‘R’‘A’‘N’‘\0’‘C’‘\0’‘C’‘+’‘+’‘\0’……0088:22522253225422552256225722582259225A225B225C0088:225D0088:225EChar*proname[].二、指針數(shù)組與二維數(shù)組字符指針數(shù)組與字符二維數(shù)組的主要不同之處是:字符指針數(shù)組元素指向的字符串可以是不規(guī)那么的長度。字符二維數(shù)組的每個元素的長度必須相同,在定義時已確定。例如:上例中proname[0]→8個字節(jié)字符串proname[1]→2個字節(jié)字符串proname[2]→4個字節(jié)字符串總字節(jié)數(shù)為6+14=20在二維數(shù)組中:charname[3][8]={“FORTRAN〞,“C〞,“C++〞};共需3×8=24個字節(jié)??梢娛褂米址羔様?shù)組更靈活方便。.三、指向指針的指針如果在一個指針變量中存放的是另一個變量的指針的地址,稱該指針為指向指針的指針,即二重指針。例如:以下圖中P是二重指針&q&v120p指針q指針v變量*p**p.如下面定義:char*pc[]={“abc〞,“def〞,“hig〞};char**ppc;//定義ppc為二重指針ppc=pc;顯然指針數(shù)組名pc就是一個二重指針。例如下面的程序把字符指針數(shù)組作為實參進行函數(shù)調(diào)用:#include<iostream.h>voidprint(char*[],int);voidmain(){char*pn[]={“Fred〞,“Barney〞,“Wilma〞,“Betty〞};intnum=sizeof(pn)/sizeof(char*);//求數(shù)組元素個數(shù)(8/2)print(pn,num);//數(shù)組名pn為二重指針作為實參數(shù)進行函數(shù)調(diào)用}.四、NULL指針NULL是空指針。在C++中,NULL取值為0,常常用以表示指針不指向任何地方的一種狀態(tài)。void*表示指針指向的目標對象無數(shù)據(jù)類型。注意兩者的區(qū)別。.在程序中,引用可作為目標變量或?qū)ο蟮膭e名而使用,對引用的操作實際上就是對目標變量或?qū)ο蟮牟僮鳌=⒁玫姆椒ǎ?/p>
intvalue;int&rvalue=value;//rvalueinitialized說明rvalue是對整型數(shù)據(jù)的引用,并初始化為整型變量value的引用?!?.7引用的概念A(yù)referenceisanalternativenameforvariableorobject.Toensurethatareferenceisboundtoavariablenameoranobjectname,wemustinitializethereference..注意1、引用在說明時必須初始化,初始化變量必須是已定義的變量;2、引用不是變量,只是替代某個變量的別名;3、引用不占內(nèi)存空間,引用的地址與綁定的變量相同。在程序中對引用的訪問就是對其綁定的變量的訪問。.#include<iostream.h>voidmain(){intintone;int&rint=intone;intone=5;cout<<“intone=〞<<intone<<endl;cout<<“rint=〞<<rint<<endl;rint=25;cout<<“intone=〞<<intone<<endl;cout<<“rint=〞<<rint<<endl;}運行結(jié)果為:
intone=5rint=5intone=25rint=25例如:下面程序說明引用與其綁定的變量之間的關(guān)系。.注意:引用運算符與取地址運算符使用了相同符號“&〞,但使用場合不同,意義不同;引用運算符“&〞僅在說明一個引用時使用,放在類型名后面,表示是該數(shù)據(jù)類型的引用;在程序中,“&〞作為取地址操作運算符,放在變量前面。例如:intcount;int&sum=count;//引用說面intcount;int*ip=&count;//取地址,對指針初始化cout<<&ip;//輸出變量ip的地址cout<<&count;//輸出變量count的地址.如果程序中取引用的地址,它返回引用綁定的目標變量的地址;(2)對引用賦值,就是對綁定的目標變量的賦值;(3)假設(shè)說明一個引用為T&,那么引用必須用類型T的目標變量,或能轉(zhuǎn)換成類型T的目標變量進行初始化。例如下面的說明語句是合法的,double&rr=1;因為整型1可以轉(zhuǎn)換為double,此種情況下:首先作必要的類型轉(zhuǎn)換;然后將結(jié)果置于臨時變量;最后把臨時變量的地址作為初始化的值。所以該說明語句可以解釋成:doubletemp;temp=double(1);double&rr=temp;§5.8引用的操作.(4)可以說明對指針變量的引用,例如:
int*a;int*&p=
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年媒體經(jīng)營合作協(xié)議書
- 2025年度物流車輛維修配件供應(yīng)合同
- 2025年度新型建筑材料應(yīng)用示范工程售后服務(wù)保障書
- 2025年激光影像輸出膠片項目合作計劃書
- 2025年度國際物流公司項目總監(jiān)聘用合同模板3篇
- 優(yōu)化幼兒園教研學(xué)期工作計劃的管理與執(zhí)行
- 客戶化需求對倉庫的影響計劃
- 建立規(guī)范的接待標準與流程計劃
- 社區(qū)養(yǎng)老服務(wù)體系的完善計劃
- 班主任我們永遠的信仰計劃
- 駱駝祥子 故事情節(jié)
- 馬克思主義宗教觀課件
- 語文版九年級下冊課外閱讀練習(xí)
- 【課件】第11課+美術(shù)的曙光-史前與早期文明的美術(shù)+課件高中美術(shù)人教版(2019)美術(shù)鑒賞
- 高中化學(xué)人教版一輪復(fù)習(xí)-晶體結(jié)構(gòu)與性質(zhì)(復(fù)習(xí)課件)
- GB/T 22919.3-2008水產(chǎn)配合飼料第3部分:鱸魚配合飼料
- 船舶涂裝課件
- 【薪酬】國有企業(yè)中長期股權(quán)激勵課件
- 《新聞攝影教程(第五版)》第三章 新聞攝影工作者的職責(zé)與素養(yǎng)
- 學(xué)前兒童行為觀察第一章觀察概述課件
- 化學(xué)品防范說明編碼
評論
0/150
提交評論