版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
六、指針與引用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指針運(yùn)算6.1.1變量的地址1、內(nèi)存的每個(gè)字節(jié)都有一個(gè)編號(hào)。這個(gè)編號(hào)就是這個(gè)字節(jié)對(duì)應(yīng)的內(nèi)存地址。2、程序中的每個(gè)數(shù)據(jù)都對(duì)應(yīng)著內(nèi)存中的一個(gè)地址,從該地址開(kāi)始的一個(gè)或多個(gè)字節(jié)用來(lái)存放該數(shù)據(jù)。如:inti,j,k;i=3;j=6;3、內(nèi)存單元的地址和內(nèi)存單元的內(nèi)容的區(qū)別4、程序編譯后,變量名轉(zhuǎn)換為變量的地址,計(jì)算機(jī)通過(guò)內(nèi)存地址對(duì)變量進(jìn)行存取。5、變量的直接訪問(wèn)和間接訪問(wèn)直接訪問(wèn):通過(guò)變量的地址(變量名)存取變量。間接訪問(wèn):通過(guò)存放變量的地址的變量存取變量。6、”指向”的含義存放變量a的地址(&a)的變量指向變量a。1、變量的指針:即變量的地址。2、指針變量:專(zhuān)門(mén)用來(lái)存放另一個(gè)變量的地址的變量。指針變量的值(即指針變量中存放的值)是指針(地址)。3、聲明指針變量: 數(shù)據(jù)類(lèi)型*變量;4、指針變量的初始化
inta=100; int*p=&a;5、指針變量的引用(取地址運(yùn)算符&與指針運(yùn)算符*)&只能作用于變量:&x,&a[5];//正確不能作用于常量、表達(dá)式:&25,&(i+1);//錯(cuò)誤int*p;p=3000無(wú)意義intx,*p;x=p無(wú)意義4、有關(guān)說(shuō)明 指針變量的地址,。。。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指針運(yùn)算算術(shù)運(yùn)算:加法運(yùn)算和減法運(yùn)算關(guān)系運(yùn)算:比較兩個(gè)指針變量賦值運(yùn)算:6.2指針與數(shù)組(一維數(shù)組)
每個(gè)變量都有地址。 一個(gè)數(shù)組包含若干元素,每個(gè)數(shù)組元素都在內(nèi)存中占用存儲(chǔ)單元,它們也都有相應(yīng)的地址。指針變量既然可以指向變量,當(dāng)然也可以指向數(shù)組和數(shù)組元素(把數(shù)組起始地址或某一元素的地址放到一個(gè)指針變量中)。 所謂數(shù)組的指針是指數(shù)組的起始地址,數(shù)組元素的指針是數(shù)組元素的地址。數(shù)組,指針,循環(huán)語(yǔ)句三者是天生的好搭檔例如:inta[10];
//定義a為包含10個(gè)整型數(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]的地址,或者說(shuō),它們指向a數(shù)組的第i個(gè)元素,見(jiàn)圖。這里需要說(shuō)明的是a代表數(shù)組首地址,a+i也是地址,它的計(jì)算方法同p+i,即它的實(shí)際地址為a+i×sizeof(int)。例如,p+9和a+9的值是&a[9],它指向a[9]。6.2.2通過(guò)指針訪問(wèn)數(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í)際上,在編譯時(shí),對(duì)數(shù)組元素a[i]就是處理成*(a+i),即按數(shù)組首地址加上相對(duì)位移量得到要找的元素的地址,然后找出該單元中的內(nèi)容。 例如,若數(shù)組a的首地址為1000,設(shè)數(shù)組為int型,且sizeof(int)=4,則a[3]的地址是這樣計(jì)算出來(lái)的:
1000+3×4=1012,然后從1012地址所標(biāo)志的整型單元取出元素的值,即a[3]的值??梢钥闯?,[]實(shí)際上是變址運(yùn)算符,即將a[i]按a+i計(jì)算地址,然后找出此地址單元中的值。(3)指向數(shù)組的指針變量也可以帶下標(biāo),如p[i]與(p+i)等價(jià)。根據(jù)以上敘述,引用一個(gè)數(shù)組元素,可以用:下標(biāo)法,如a[i]形式;指針?lè)?,?(a+i)或*(p+i)。其中a是數(shù)組名,p是指向數(shù)組的指針變量,其初值p=a。例:輸出數(shù)組元素。下標(biāo)法。通過(guò)數(shù)組名計(jì)算數(shù)組元素地址,找出元素的值。用指針變量指向數(shù)組元素。6.2.3舉例說(shuō)明//例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指針變量的空間申請(qǐng)和釋放6.3.4指針與函數(shù)6.3.1堆內(nèi)存
堆是程序運(yùn)行時(shí)動(dòng)態(tài)使用的一個(gè)內(nèi)存空間,要在堆中分配空間,必須使用特定的函數(shù),使用完成后必須及時(shí)釋放空間。6.3.2堆內(nèi)存操作函數(shù)(C語(yǔ)言的選擇)void*malloc(unsignedlongsize)voidfree(void*)頭文件為:alloc.h上面的堆內(nèi)存操作函數(shù)在C++中不太常用!使用new分配內(nèi)存空間使用delete釋放內(nèi)存空間例如:intmain(){
int*p=newint[10]; //申請(qǐng)空間
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; //釋放空間,注意不要忘了中括號(hào)
return0;}6.3.3指針變量的空間申請(qǐng)和釋放6.3.4指針與函數(shù)指針或變量的地址作為函數(shù)參數(shù)指針函數(shù)(課后了解)函數(shù)指針(課后了解)例:使用指針作為參數(shù),設(shè)計(jì)函數(shù),參數(shù)為a,b,c3個(gè)整型變量的地址,執(zhí)行函數(shù)后,實(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”);//正確//下列語(yǔ)句有潛在風(fēng)險(xiǎn)strcpy(str,“Helloworld!”);//風(fēng)險(xiǎn)舉例inta=100;charstr[6]=“China”;strcpy(str,“Helloworld!”);cout<<a<<endl;
運(yùn)行結(jié)果:5602294906.4.1字符指針的使用另外,常用的可行方法:charstr[6]=“China”;strings1=str;//此時(shí)s1和str占據(jù)2塊不同的內(nèi)存區(qū)域s1=“Helloworld”;//正確strings2=“Helloworld”;//方法c_str()將string強(qiáng)制轉(zhuǎn)換成c格式的字符串char*p=(char*)s2.c_str();cout<<p<<endl;6.4.2字符指針與字符數(shù)組的區(qū)別概念
數(shù)組是一個(gè)整體,指針只是地址賦值方式:charstr[20],*p;strcpy(str,“helloworld”):p=“helloworld”;內(nèi)存分配方式: 數(shù)組空間在編譯時(shí)分配,指針的指向運(yùn)行時(shí)確定能否賦值數(shù)組名是常量(即數(shù)組首地址),不能對(duì)數(shù)組名賦值指針可以直接賦值6.5指針數(shù)組指針數(shù)組的簡(jiǎn)單介紹6.6引用的概念和操作(不作要求,了解)6.6.1引用的概念6.6.2引用的操作6.6.3引用的說(shuō)明6.6.1引用的概念在C++中,引用提供了一種把實(shí)體的變量作為該實(shí)體的別名的機(jī)制。通俗地說(shuō),引用即給對(duì)象起“別名”。引用運(yùn)算符是“&”?!?”在定義時(shí)出現(xiàn)在賦值運(yùn)算符的左邊表示是“引用”,否則是取址符;一個(gè)對(duì)象一旦有了別名,此別名就不能再作為別的對(duì)象的別名,所以聲明時(shí)必須進(jìn)行初始化;有了別名的對(duì)象,不管對(duì)真名、還是對(duì)別名進(jìn)行操作,都是對(duì)此對(duì)象進(jìn)行操作;一個(gè)被聲明成引用的變量,并不另外再占有存儲(chǔ)空間。6.6.2引用的操作用引用傳遞函數(shù)的參數(shù)利用引用返回多個(gè)值
(把需要返回的多個(gè)值的引用作為函數(shù)的參數(shù))例:設(shè)計(jì)函數(shù),參數(shù)為a,b,c3個(gè)整型變量,執(zhí)行函數(shù)后,滿(mǎn)足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個(gè)引用
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例:利用引用返回多個(gè)值由于引用能夠改變參數(shù)的值,因此利用這個(gè)特點(diǎn)就可以實(shí)現(xiàn)返回多個(gè)值。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引用的說(shuō)明引用在聲明的時(shí)候必須同時(shí)要初始化,否則會(huì)出現(xiàn)錯(cuò)誤。引用是從一而終的,在初始化后不會(huì)再指向其他的變量。任何對(duì)該引用的賦值都是對(duì)引用所維系的目標(biāo)賦值,而不是將引用維系到另一個(gè)目標(biāo)上。由于引用本身不是類(lèi)型,所以沒(méi)有引用的指針和引用的引用。但可以有指針的引用。用引用傳遞函數(shù)參數(shù)與指針的效果一樣,傳遞的是原來(lái)的變量或?qū)ο?,而不是在函?shù)作用域內(nèi)建立副本??梢岳靡梅祷囟鄠€(gè)值 shortinta[3][4]={ {1,3,5,7},
{9,11,13,15},
{17,19,21,23}}; a是一個(gè)數(shù)組名。a數(shù)組包含3行,即3個(gè)元素:a[0],a[1],a[2]。而每一元素又是一個(gè)一維數(shù)組,它包含4個(gè)元素(即4個(gè)列元素),例如,a[0]所代表的一維數(shù)組又包含4個(gè)元素:a[0][0],a[0][1],a[0][2],a[0][3],見(jiàn)下圖。6.7指針與二維數(shù)組(自主學(xué)習(xí))本節(jié)內(nèi)容相對(duì)較難理解,建議通過(guò)實(shí)踐來(lái)幫助理解
從二維數(shù)組的角度來(lái)看,a代表整個(gè)二維數(shù)組的首地址,也就是第0行的首地址。a+1代表第1行的首地址。如果二維數(shù)組的首地址為2000,則a+1為2008,因?yàn)榈?行有4個(gè)short型數(shù)據(jù),因此a+1的含義是a[1]的地址,即a+4×2=2008。a+2代表第2行的首地址,它的值是2016,見(jiàn)下圖。
a[0]、a[1]、a[2]既然是一維數(shù)組名,而C/C++語(yǔ)言又規(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來(lái)表示。
此時(shí)“a[0]+1”中的1代表1個(gè)列元素的字節(jié)數(shù),即2個(gè)字節(jié)。今a[0]的值是2000,a[0]+1的值是2002(而不是2008)。這是因?yàn)楝F(xiàn)在是在一維數(shù)組范圍內(nèi)討論問(wèn)題的,正如有一個(gè)一維數(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)等價(jià),a[1]和*(a+1)等價(jià),a[i]和*(a+i)等價(jià)。因此,a[0]+1和*(a+0)+1的值都是&a[0][1](即右圖中的2002)。a[1]+2和*(a+1)+2的值都是&a[1][2](即右圖中的2012)。請(qǐng)注意不要將*(a+1)+2錯(cuò)寫(xiě)成*(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ù)請(qǐng)記住*(a+i)和a[i]是等價(jià)的。 有必要對(duì)a[i]的性質(zhì)作進(jìn)一步說(shuō)明。a[i]從形式上看是a數(shù)組中第i個(gè)元素。如果a是一維數(shù)組名,則a[i]代表a數(shù)組第i個(gè)元素所占的內(nèi)存單元。a[i]是有物理地址的,是占內(nèi)存單元的。但如果a是二維數(shù)組,則a[i]是代表一維數(shù)組名。a[i]本身并不占內(nèi)存單元,它也不存放a數(shù)組中各個(gè)元素的值。它只是一個(gè)地址(如同一個(gè)一維數(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ù)思考。首先說(shuō)明,a+1是地址(指向第1行首地址),而*(a+1)并不是“a+1單元的內(nèi)容(值)”,因?yàn)閍+1并不是一個(gè)實(shí)際變量,也就談不上它的內(nèi)容。*(a+1)就是a[1],而a[1]是一維數(shù)組名,所以也是地址。以上各種形式都是地址計(jì)算的不同表示。 為了說(shuō)明這個(gè)容易搞混的問(wèn)題,舉例子來(lái)說(shuō)明。 有一個(gè)排,下設(shè)3個(gè)班,每班有10名戰(zhàn)士。規(guī)定排長(zhǎng)只管理到班,班長(zhǎng)管理戰(zhàn)士。在排長(zhǎng)眼里只有第0、1、2班(為與C/C++語(yǔ)言中數(shù)組下標(biāo)一致,假定班號(hào)也從0開(kāi)始)。排長(zhǎng)從第0班的起始位置走到第1班的起始位置,看來(lái)只走了一步,但實(shí)際上它跳過(guò)了10個(gè)戰(zhàn)士。這相當(dāng)于a+1(見(jiàn)后圖)。為了找到某一班內(nèi)某一個(gè)戰(zhàn)士,必須給兩個(gè)參數(shù),即第i班第j個(gè)戰(zhàn)士,先找到第i班,然后由該班班長(zhǎng)在本班范圍內(nèi)找第j個(gè)戰(zhàn)士。這個(gè)戰(zhàn)士的位置就是a[i]+j(這是一個(gè)地址)。開(kāi)始時(shí)班長(zhǎng)面對(duì)第0個(gè)戰(zhàn)士。注意,排長(zhǎng)和班長(zhǎng)的初始位置是相同的(如圖中的a和a[0]都是2000)。但它們的“指向”是不同的。
排長(zhǎng)“指向”班,他走一步就跳過(guò)1個(gè)班,而班長(zhǎng)“指向”戰(zhàn)士,走一步只是指向下一個(gè)戰(zhàn)士??梢钥吹脚砰L(zhǎng)是“宏觀管理”,只管班,在圖中是控制縱向,班長(zhǎng)則是“微觀管理”,管理到戰(zhàn)士,在圖上是控制橫向。如果要找第1班第2個(gè)戰(zhàn)士,則先由排長(zhǎng)找到第1班的班長(zhǎng),然后,由班長(zhǎng)在本班范圍內(nèi)找到第2個(gè)戰(zhàn)士。二維數(shù)組a相當(dāng)于排長(zhǎng),每一行(即一維數(shù)組a[0]、a[1]、a[2])相當(dāng)于班長(zhǎng),每一行中的元素(如a[1][2])相當(dāng)于戰(zhàn)士。a+1與a[0]+1是不同的,a+1是第1行的首地址,a+1指向第1行(相當(dāng)于排長(zhǎng)走到第1班的開(kāi)頭),而*(a+1)或a[1]或a[1]+0都指向第1行第0列元素(相當(dāng)于第1班第0個(gè)戰(zhàn)士),二者地址雖相同,但含義不同了
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 內(nèi)蒙古阿拉善盟2025屆高三壓軸卷數(shù)學(xué)試卷含解析
- 廣西賀州市2025屆高考數(shù)學(xué)四模試卷含解析
- 2025屆湖南省桃江縣一中高三下學(xué)期第六次檢測(cè)語(yǔ)文試卷含解析
- 2025屆廣東省清遠(yuǎn)市陽(yáng)山縣陽(yáng)山中學(xué)高三第四次模擬考試英語(yǔ)試卷含解析
- 數(shù)據(jù)資產(chǎn)管理體系建設(shè)指南(雷澤佳編制-2024)
- 貴州省貴定縣第二中學(xué)2025屆高三考前熱身語(yǔ)文試卷含解析
- 江蘇省鹽城市、南京市2025屆高三第二次模擬考試語(yǔ)文試卷含解析
- 8.2《登高》課件 2024-2025學(xué)年統(tǒng)編版高中語(yǔ)文必修上冊(cè)
- 《教學(xué)與科研》課件
- 福建省晉江市平山中學(xué)2025屆高三第四次模擬考試語(yǔ)文試卷含解析
- (完整版)臨床檢驗(yàn)基礎(chǔ)名詞解釋
- 深度分析澳洲資源量最大的皮爾巴拉地區(qū)礦床匯總
- 《工程與試驗(yàn)》編委會(huì)章程
- 市政道路與橋梁銜接處設(shè)計(jì)及施工
- 【機(jī)械畢業(yè)論文】便攜式電火花小孔機(jī)結(jié)構(gòu)設(shè)計(jì)
- 實(shí)習(xí)錄用通知書(shū)
- DFMEA模板全解(完整版)
- 蘇教版二年級(jí)上冊(cè)《連乘連除乘除混合》PPT
- 頸動(dòng)脈狹窄的治療策略CREST研究解讀
- 深圳市建筑工程消耗量定額2016[共70頁(yè)]
- (完整版)土石方挖運(yùn)專(zhuān)項(xiàng)施工方案
評(píng)論
0/150
提交評(píng)論