中國(guó)地質(zhì)大學(xué)C_第1頁(yè)
中國(guó)地質(zhì)大學(xué)C_第2頁(yè)
中國(guó)地質(zhì)大學(xué)C_第3頁(yè)
中國(guó)地質(zhì)大學(xué)C_第4頁(yè)
中國(guó)地質(zhì)大學(xué)C_第5頁(yè)
已閱讀5頁(yè),還剩32頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第五章指針和引用.指針是一種特殊的數(shù)據(jù)類型。指針概念是C++語(yǔ)言中較難理解和較難掌握的概念之一。本章介紹指針的概念、定義、運(yùn)算等內(nèi)容。

指針變量是一種特殊的變量,變量中存放的不是某種數(shù)據(jù)類型的數(shù)據(jù),而是另一個(gè)變量或常量的地址?!?.1指針概念如有定義:intvalue=150;charch=‘M’;并執(zhí)行賦值語(yǔ)句:pv=&value;pc=&ch;//pvholdstheaddressofvalue由于pv中存放的是value變量的地址,pc中存放的是ch變量的地址,故稱pv和pc為指針變量。簡(jiǎn)稱為指針〔Pointer〕。.指針指向的對(duì)象稱為目標(biāo)或目標(biāo)變量〔常量〕。如圖7.1所示:…150…‘M’…

…valuechpvpc*pv*pc圖1內(nèi)存空間1000H1050H0000H&value1000H1001H&ch1050H&pc11A2H11A3H11A1H&pv11A0H.C++規(guī)定:目標(biāo)或目標(biāo)變量可以用指針變量名前加上運(yùn)算符“*〞表示。pv的目標(biāo)變量value可表示為*pv,pc的目標(biāo)變量ch可表示為*pc,即*pv和value等效*pc和ch等效而&pv和&pc表示針變量本身的地址,當(dāng)指針變量為2個(gè)字節(jié)時(shí),最大訪問(wèn)地址為:指針的定義指針變量也必須先定義后使用定義的一般格式:類型定義符*指針變量名;其中:類型定義符——指針指向?qū)ο蟮臄?shù)據(jù)類型“*〞——說(shuō)明符,表示其后的標(biāo)識(shí)符是指針變量,而不是一般變量。.例如:

int*ptr;char*name;float*pf;其中,定義ptr,name,pf分別為指向整型、字符型和浮點(diǎn)型數(shù)據(jù)的指針。

constint*ptr;//pointertointconstconstchar*cpcconstfloat*point其中,ptr,cpc,point為指向常量的指針。注意:指針變量可以與其他變量一起定義,如:

inta,bb,*c;char*p,*q,ch;指針變量也可定義為全局,靜態(tài)和局部的指針。.例如:intnum,*pn;charcolor,*pc;執(zhí)行語(yǔ)句pn=#pc=&color;那么在程序中*pn=100;等效于num=100;*pc=‘r’;等效于color=‘r’;這里,“*〞作為訪問(wèn)目標(biāo)變量的運(yùn)算符,在定義指針時(shí),“*〞作為說(shuō)明符。注意使用上的區(qū)別?!?.2指針賦值使用指針前,必須給已定義指針變量賦以指向目標(biāo)變量的地址值?!?〞操作符可獲取變量的地址。.指針賦值的幾種情況:同種數(shù)據(jù)類型的指針變量之間可以相互賦值。

inta,*pa,*pb;pa=&a;pb=pa;//pa,pbholdsthesameaddressofa指針變量可以賦初值:

inta,b,c;int*pa=&a,*pc=&c;指針可初始化為空指針

char*p=NULL;指針變量的類型名與指向目標(biāo)的數(shù)據(jù)類型一致。

例如:

int*p,a;floatb,*q;p=&b;q=&a;//錯(cuò)誤

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指針運(yùn)算指針運(yùn)算實(shí)質(zhì)上是地址運(yùn)算。1、賦值運(yùn)算2、取地址運(yùn)算“&〞〔addressof〕和取內(nèi)容運(yùn)算“*〞〔Dereference〕,“&〞和“*〞互為逆運(yùn)算,例如:intx,*ptr=&x;那么&(*ptr)表示指針ptr*(&x)表示變量x圖2.3、指針與整數(shù)的加減運(yùn)算在數(shù)組中,指針變量加上或減去一個(gè)整數(shù)n,表示:指針由當(dāng)前所指向的位置向前或向后移動(dòng)n個(gè)數(shù)據(jù)元素的位置。移動(dòng)后的實(shí)際地址為:p±n*sizeof(數(shù)據(jù)類型)4、指針的關(guān)系運(yùn)算指向同種數(shù)據(jù)類型的指針可作關(guān)系運(yùn)算,表示它們所存放的地址之間的關(guān)系。<,>,==,!=指針運(yù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ī)定定義一個(gè)數(shù)組時(shí),用數(shù)組名存放該數(shù)組在內(nèi)存中的首地址。

當(dāng)把數(shù)組名賦予一個(gè)指針變量后,該指針指向數(shù)組,可以通過(guò)指針移動(dòng)方式訪問(wèn)數(shù)組元素。

例如:inta[20],*p;p=a;那么下標(biāo)為i的元素可表示為:a[i],*(a+i),p[i],*(p+i),對(duì)應(yīng)地址可表示為:&a[i],a+i,&p[i],p+i注意:數(shù)組名是指針常量,不是指針變量,不能給數(shù)組名賦值。.數(shù)組元素的表示方法例如.例如:下面程序是用指針?lè)绞皆L問(wèn)數(shù)組元素,計(jì)算數(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;}運(yùn)行結(jié)果為:sumis90.例如:對(duì)于前例中數(shù)組的求和元素運(yùn)算,可以有以下五種方法:#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ù)組中每個(gè)元素為字符的數(shù)組稱為字符數(shù)組,字符數(shù)組可用單個(gè)字符常量初始化,也可用字符串常量初始化,例如:charbuffer[]=“hello〞;二、字符串常量在C++中,字符串常量是由雙引號(hào)括起的一串字符。字符串常量通常存放在dataarea的const區(qū)中,并以‘\0’作為結(jié)束符,編譯器記下其起始地。即:地址代表了這個(gè)字符串常量。由于字符串常量的地址屬性,所以由相同字符組成的字符串常量是兩個(gè)不同起始地址的字符串常量。§5.5字符指針.三、字符指針指向字符類型的指針?lè)Q為字符指針。字符串常量和字符數(shù)組名都具有地址特性,當(dāng)把它們賦給一個(gè)字符指針后,編譯器規(guī)定:輸出字符指針就是輸出字符串;輸出字符指針指向的對(duì)象,就是輸出單個(gè)字符。.例如:#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}.四、字符串比較字符串比較是指兩個(gè)字符串進(jìn)行逐個(gè)字符的一一比較。通常使用在string.h頭文件中定義的strcmp()函數(shù),其原型為:intstrcmp(constchar*str1,constchar*str2);其返回值:(1)當(dāng)str1串等于str2串時(shí),返回值0;(2)當(dāng)str1串大于str2串時(shí),返回一個(gè)正值;(3)當(dāng)str1串小于str2串時(shí),返回一個(gè)負(fù)值。.五、字符串賦值C++中,可以使用在string.h中定義的標(biāo)準(zhǔn)函數(shù)strcpy()對(duì)字符數(shù)組進(jìn)行賦值。函數(shù)原型為:char*strcpy(char*dest,constchar*src);返回值為dest值。例如:charbuffer1[10];charbuffer2[10];strcpy(buffer1,〞hello〞);strcpy(buffer2,buffer1);字符串常量“hello〞賦給字符數(shù)組buffer2。.一、定義一個(gè)數(shù)組中假設(shè)每個(gè)元素都是一個(gè)指針,那么稱為指針數(shù)組。例如:定義一個(gè)指針數(shù)組并初始化char*proname[]={“FORTRAN〞,“C〞,“C++〞};該數(shù)組的每個(gè)元素是指向字符串常量的字符指針,指針指向的字符串常量存放在dataarea的const存儲(chǔ)區(qū)中,可能連續(xù),也可能不連續(xù)?!?.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ī)那么的長(zhǎng)度。字符二維數(shù)組的每個(gè)元素的長(zhǎng)度必須相同,在定義時(shí)已確定。例如:上例中proname[0]→8個(gè)字節(jié)字符串proname[1]→2個(gè)字節(jié)字符串proname[2]→4個(gè)字節(jié)字符串總字節(jié)數(shù)為6+14=20在二維數(shù)組中:charname[3][8]={“FORTRAN〞,“C〞,“C++〞};共需3×8=24個(gè)字節(jié)??梢?jiàn)使用字符指針數(shù)組更靈活方便。.三、指向指針的指針如果在一個(gè)指針變量中存放的是另一個(gè)變量的指針的地址,稱該指針為指向指針的指針,即二重指針。例如:以下圖中P是二重指針&q&v120p指針q指針v變量*p**p.如下面定義:char*pc[]={“abc〞,“def〞,“hig〞};char**ppc;//定義ppc為二重指針ppc=pc;顯然指針數(shù)組名pc就是一個(gè)二重指針。例如下面的程序把字符指針數(shù)組作為實(shí)參進(jìn)行函數(shù)調(diào)用:#include<iostream.h>voidprint(char*[],int);voidmain(){char*pn[]={“Fred〞,“Barney〞,“Wilma〞,“Betty〞};intnum=sizeof(pn)/sizeof(char*);//求數(shù)組元素個(gè)數(shù)(8/2)print(pn,num);//數(shù)組名pn為二重指針作為實(shí)參數(shù)進(jìn)行函數(shù)調(diào)用}.四、NULL指針NULL是空指針。在C++中,NULL取值為0,常常用以表示指針不指向任何地方的一種狀態(tài)。void*表示指針指向的目標(biāo)對(duì)象無(wú)數(shù)據(jù)類型。注意兩者的區(qū)別。.在程序中,引用可作為目標(biāo)變量或?qū)ο蟮膭e名而使用,對(duì)引用的操作實(shí)際上就是對(duì)目標(biāo)變量或?qū)ο蟮牟僮?。建立引用的方法?/p>

intvalue;int&rvalue=value;//rvalueinitialized說(shuō)明rvalue是對(duì)整型數(shù)據(jù)的引用,并初始化為整型變量value的引用。§5.7引用的概念A(yù)referenceisanalternativenameforvariableorobject.Toensurethatareferenceisboundtoavariablenameoranobjectname,wemustinitializethereference..注意1、引用在說(shuō)明時(shí)必須初始化,初始化變量必須是已定義的變量;2、引用不是變量,只是替代某個(gè)變量的別名;3、引用不占內(nèi)存空間,引用的地址與綁定的變量相同。在程序中對(duì)引用的訪問(wèn)就是對(duì)其綁定的變量的訪問(wèn)。.#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;}運(yùn)行結(jié)果為:

intone=5rint=5intone=25rint=25例如:下面程序說(shuō)明引用與其綁定的變量之間的關(guān)系。.注意:引用運(yùn)算符與取地址運(yùn)算符使用了相同符號(hào)“&〞,但使用場(chǎng)合不同,意義不同;引用運(yùn)算符“&〞僅在說(shuō)明一個(gè)引用時(shí)使用,放在類型名后面,表示是該數(shù)據(jù)類型的引用;在程序中,“&〞作為取地址操作運(yùn)算符,放在變量前面。例如:intcount;int&sum=count;//引用說(shuō)面intcount;int*ip=&count;//取地址,對(duì)指針初始化cout<<&ip;//輸出變量ip的地址cout<<&count;//輸出變量count的地址.如果程序中取引用的地址,它返回引用綁定的目標(biāo)變量的地址;(2)對(duì)引用賦值,就是對(duì)綁定的目標(biāo)變量的賦值;(3)假設(shè)說(shuō)明一個(gè)引用為T&,那么引用必須用類型T的目標(biāo)變量,或能轉(zhuǎn)換成類型T的目標(biāo)變量進(jìn)行初始化。例如下面的說(shuō)明語(yǔ)句是合法的,double&rr=1;因?yàn)檎?可以轉(zhuǎn)換為double,此種情況下:首先作必要的類型轉(zhuǎn)換;然后將結(jié)果置于臨時(shí)變量;最后把臨時(shí)變量的地址作為初始化的值。所以該說(shuō)明語(yǔ)句可以解釋成:doubletemp;temp=double(1);double&rr=temp;§5.8引用的操作.(4)可以說(shuō)明對(duì)指針變量的引用,例如:

int*a;int*&p=

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論