新聞中心
這篇文章主要介紹“C++中的指針如何使用”,在日常操作中,相信很多人在C++中的指針如何使用問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”C++中的指針如何使用”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
創(chuàng)新互聯(lián)長(zhǎng)期為近1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為紅旗企業(yè)提供專業(yè)的成都做網(wǎng)站、網(wǎng)站設(shè)計(jì),紅旗網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
C++程序設(shè)計(jì)重要基礎(chǔ)就是類(lèi)和對(duì)象,對(duì)象指針是很重要的一部分,包括指向?qū)ο蟮?strong>指針、指向?qū)ο蟪蓡T的指針、this指針、指向?qū)ο蟮某V羔?、指向常?duì)象的指針等。
1、指向?qū)ο蟮闹羔?/strong>
定義:對(duì)象空間的起始地址就是對(duì)象的指針。
說(shuō)明:在建立對(duì)象時(shí),編譯系統(tǒng)就為每個(gè)對(duì)象分配一定的存儲(chǔ)空間以存放其成員,不過(guò)注意,在一般情況下不同對(duì)象的數(shù)據(jù)存儲(chǔ)單元中存放的數(shù)據(jù)成員是不相同,而不同對(duì)象的函數(shù)代碼卻是相同的,也就是說(shuō),它們的函數(shù)代碼是共享的。這時(shí)我們可以定義一個(gè)指針變量用來(lái)存放對(duì)象的指針。
定義指向類(lèi)對(duì)象的指針變量的一般形式是:
類(lèi)名 *對(duì)象指針名;
如對(duì)于與個(gè)Time類(lèi)對(duì)象,我們可以有:
Time t; Time *p; p=&t;
我們就可以通過(guò)對(duì)象指針訪問(wèn)對(duì)象和對(duì)象的成員,假如所定義的類(lèi)中有數(shù)據(jù)成員hour、minute、sec,成員函數(shù)有g(shù)ettime(),則
(*p).hour 即為p指向?qū)ο笾械膆our成員,相當(dāng)于t.hour
(*p).gettime() 即為p指向?qū)ο笾械某蓡T函數(shù)gettime(),相當(dāng)于t.gettime()
也可以用如下形式:
p->hour 和 p->gettime()和上面是等價(jià)的。
2、指向?qū)ο蟪蓡T的指針
(1)指向?qū)ο髷?shù)據(jù)成員的指針
在C中我們學(xué)過(guò)指向普通變量的指針變量,在C++中定義指向?qū)ο髷?shù)據(jù)成員的指針變量的方法和定義指向普通變量的指針變量方法相同,其一般形式為:
數(shù)據(jù)類(lèi)型名 *指針變量名;
如:
int *p; p=&t.hour; //將對(duì)象t的數(shù)據(jù)成員hour的地址賦給p,p指向t.hour
(2)指向?qū)ο蟪蓡T函數(shù)的指針
定義指向?qū)ο蟪蓡T函數(shù)的指針變量和定義指向普通函數(shù)的指針變量不同。
在定義指向普通函數(shù)的指針變量時(shí)我們可以這樣定義:
void (*p)(); p=fun; (*p)(); //調(diào)用fun函數(shù)
然而編譯系統(tǒng)要求在將函數(shù)地址賦給指針變量時(shí)必須滿足三個(gè)條件:
函數(shù)參數(shù)類(lèi)型及個(gè)數(shù)要匹配
函數(shù)返回值的類(lèi)型要匹配
所屬的類(lèi)要匹配
顯然在上面的p與類(lèi)是無(wú)關(guān)的。為了滿足第三條,我們可以為指針指定類(lèi),故定義指向?qū)ο蟪蓡T函數(shù)的指針變量一般形式為:
數(shù)據(jù)類(lèi)型(類(lèi)名::*指針變量名)(參數(shù)表列);
可以讓指針指向公用的成員函數(shù),如:
void (Time::*p)(); //定義指向Time類(lèi)對(duì)象成員函數(shù)的指針變量p p=&Time::gettime; //把Time類(lèi)的公用成員函數(shù)gettime()地址賦給指針變量p (t.*p)(); //調(diào)用Time類(lèi)對(duì)象t的成員函數(shù)gettime()
注意:因?yàn)槌蓡T函數(shù)不存放在對(duì)象空間中,多個(gè)同類(lèi)對(duì)象共享此成員函數(shù)代碼,所以在將成員函數(shù)的入口地址賦給指針變量是應(yīng)寫(xiě)成:
指向?qū)ο蟪蓡T函數(shù)的指針變量=&類(lèi)名::成員函數(shù)名;
在成員函數(shù)名后面沒(méi)有"()",如果寫(xiě)成p=&Time::gettime()是錯(cuò)誤的。[nextp
3、this指針
在每個(gè)成員函數(shù)中都包含了一個(gè)特殊的指針,稱為this,它是指向本類(lèi)對(duì)象的指針,它的值是當(dāng)前被調(diào)用成員函數(shù)所在對(duì)象的起始地址。之所以有這個(gè)指針,是因?yàn)闉榱吮WC同類(lèi)的不同對(duì)象的成員函數(shù)引用的是指定對(duì)象中的數(shù)據(jù)成員,它是系統(tǒng)自動(dòng)實(shí)現(xiàn)的。
如定義一個(gè)求體積的函數(shù)
int box::vol() {return(height*width*length);}
假如已經(jīng)定義了對(duì)象t,當(dāng)調(diào)用成員函數(shù)t.vol()時(shí),編譯系統(tǒng)就把對(duì)象t的起始地址賦給this指針,于是在成員函數(shù)引用數(shù)據(jù)成員時(shí),根據(jù)指針this就可以引用到對(duì)象t的數(shù)據(jù)成員。所以C++把上面的函數(shù)處理成
int box::vol() {return(this->height*this->width*this->length);}
由于this的值是當(dāng)前被調(diào)用成員函數(shù)所在對(duì)象的起始地址,所以可以寫(xiě)成
int box::vol() {return((*this).height*(*this).width*(*this).length);}
所以在調(diào)用成員函數(shù)t.vlo()時(shí),實(shí)際的調(diào)用方式為t.vol(&t),不過(guò)對(duì)象t的地址傳給this指針是由系統(tǒng)自動(dòng)完成的,不需人為加上。
4、指向?qū)ο蟮某V羔?/strong>
將指向?qū)ο蟮闹羔樧兞柯暶鳛閏onst型且進(jìn)行處始化,這樣指針值始終保持為其初值,不能改變其指向。
如:
Time t1(8,8,8),t2; Time *const p=&t1; //常指針p指向?qū)ο髏1 p=&t2; //試圖改變p的指向,非法
由上面我們可以看出定義指向?qū)ο蟮某V羔樀囊话阈问綖椋?/p>
類(lèi)名 *const 指針變量名=對(duì)象的起始地址;
注意:指向?qū)ο蟮某V羔樧兞康闹挡荒芨淖?,但可以改變它所指向?qū)ο笾械臄?shù)據(jù)成員的值。
常指針一般用作函數(shù)的參數(shù),這樣就不允許在函數(shù)執(zhí)行過(guò)程中改變指針變量的值,使其始終保持指向原來(lái)的對(duì)象。
5、指向常對(duì)象的指針變量
首先回顧一下指向常變量的指針變量,其一般形式為:
const 類(lèi)型名 *指針變量名;
如:
const char *p;
如果一個(gè)變量已經(jīng)被聲明為常變量,那么只能用指向常變量的指針變量去指向它,而不能用一般的指針變量。另外,指向常變量的指針變量除了可以指向常變量外,還可以指向未被聲明為const的變量,但也不能通過(guò)該指針改變其值。例如:
char c='a' //定義字符變量c,未聲名為const const char *p; //定義指向常變量的指針變量p p=&c; //p指向字符變量c *p='b'; //非法 c='b'; //合法
說(shuō)明:上例中,指針變量p指向字符變量c,并不說(shuō)把c也聲明成常變量,而只是說(shuō)在通過(guò)指針變量引用c時(shí),c具有常變量的特征,其值是不能改變的,但c仍然是一個(gè)普通變量。
在指向常變量的指針中,關(guān)于函數(shù)形參的指針類(lèi)型有幾點(diǎn)值得注意:
如果函數(shù)形參是非const型指針變量,實(shí)參只能用指向非const型指針;如果函數(shù)形參是指向const型變量的指針,實(shí)參則可以是const型的或非const型的指針變量。換句話說(shuō)就是指向常變量的指針可以指向const和非const型的變量,而指向非const型變量的指針只能指向非const的變量。
用指針變量作形參時(shí)形參和實(shí)參的對(duì)應(yīng)關(guān)系表:
形參 | 實(shí)參 | 合法與否 | 改變指針?biāo)笇?duì)象的值 |
指向非const型變量的指針 | 非const變量的地址 | 合法 | 行 |
指向非const型變量的指針 | const變量的地址 | 非法 | / |
指向const型變量的指針 | const變量的地址 | 合法 | 不行 |
指向const型變量的指針 | 非const變量的地址 | 合法 | 不行 |
下面說(shuō)到正題,指向常對(duì)象的指針變量和指向常變量指針變量類(lèi)似。
如果一個(gè)對(duì)象已經(jīng)被聲明為長(zhǎng)對(duì)象,只能用指向常對(duì)象的指針變量指向它,而不能用一般的指針變量指向它。
如果定義了一個(gè)指向常對(duì)象的指針變量且使它指向一個(gè)非const的對(duì)象,其指向的對(duì)象不能通過(guò)指針來(lái)改變。
如果定義了一個(gè)指向常對(duì)象的指針變量,是不能通過(guò)它改變所指向的對(duì)象的值的,但是指針變量本身的值是可以改變的。
如:
Time t1(8,8,8),t2; //定義對(duì)象 const time *p=&t1; //定義指向常對(duì)象的指針p,并使它指向t1 p=&t2; //合法,指針p指向?qū)ο髏2
所以當(dāng)我們希望在調(diào)用函數(shù)時(shí)對(duì)象的值不被修改,我們就可以把形參定義為const型的指針變量,同時(shí)用對(duì)象的地址作實(shí)參(對(duì)象可以是const或非const型);當(dāng)要求對(duì)象不僅在調(diào)用函數(shù)中不被改變,而且在程序執(zhí)行過(guò)程中也不發(fā)生改變,我們就把它定義為const型。所以指向常對(duì)象的指針最常用于函數(shù)的參數(shù),以保護(hù)形參指針?biāo)赶虻膶?duì)象在函數(shù)執(zhí)行過(guò)程中不被修改。
到此,關(guān)于“C++中的指針如何使用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
網(wǎng)站標(biāo)題:C++中的指針如何使用
URL地址:http://www.dlmjj.cn/article/goggic.html