星號(hào)的秘密-創(chuàng)新互聯(lián)

瓊山網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,瓊山網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為瓊山成百上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的瓊山做網(wǎng)站的公司定做!ong>1、乘法運(yùn)算符   2、定義指針 int *p = 0; 還是 int* p = 0;? 后一種比較容易這樣理解:定義了一個(gè)變量p,它是指針型的(更詳細(xì)一點(diǎn),是指向int的指針型),相比而言,前面一種定義似乎是定義了*P這個(gè)奇怪的東西。但是后面一種寫法會(huì)帶來一個(gè)容易產(chǎn)生的誤解: int* p1, p2; 這兒給人的感覺似乎是定義了兩個(gè)指針型變量p1和p2,但是,事實(shí)上,這種直覺是錯(cuò)誤的,正確的理解方式是int *p1, p2;即p1是指針型的,而p2確是整型的。 在MS VC++ 6.0中,是按照后面一種格式寫的。   3、何謂指針? 指針僅僅表示一個(gè)內(nèi)存中的某個(gè)地址? 非也,注意到,我們?cè)诙x指針的時(shí)候,都關(guān)聯(lián)了一個(gè)類型,如int,char,或者是string等等,如果說指針僅僅表示一個(gè)內(nèi)存中的地址,那何必要關(guān)聯(lián)這么多變化的東西呢?完全可以DWORD p=0;這樣解決問題。 關(guān)聯(lián)了的數(shù)據(jù)類型是作何用的呢? 它可以指示編譯器怎樣解釋特定地址上內(nèi)存的內(nèi)容,以及該內(nèi)存區(qū)域應(yīng)該跨越多少內(nèi)存單元。如 int *p; 編譯器可以從這個(gè)定義中獲得信息:1、p指向的內(nèi)存存放的是整型數(shù)據(jù),2、由于該內(nèi)存區(qū)域只存放了一個(gè)數(shù)據(jù),跨越的內(nèi)存區(qū)域?yàn)?個(gè)字節(jié),即p+1的效果是跳過了四個(gè)字節(jié)。 另一個(gè)復(fù)雜一點(diǎn)的例子,如 struct a {int x1; short x2; a *next; } 定義指針 a *p;那么編譯器對(duì)這個(gè)指針又作何解釋呢? 1、p指向的內(nèi)存區(qū)域依次存放了三種類型的數(shù)據(jù),分別是int,short和一個(gè)指針型數(shù)據(jù)。 2、p指向的內(nèi)存區(qū)域跨越了12個(gè)字節(jié),即p+1的效果是跳過了12個(gè)字節(jié)。(為何不是10?對(duì)齊的原因)   但是,C++中定義了一種特殊的指針,它去處了一般指針中對(duì)內(nèi)存區(qū)域內(nèi)容以及大小的解釋,以滿足特定定的需要,如我們只需要某塊內(nèi)存的首地址,不需要考慮其中的數(shù)據(jù)類型以及大小。這種形式為 void *; 這種類型的指針可以被任意數(shù)據(jù)類型的指針賦值,如上面的a* 型,void *q = p; 唯一例外的是,不能把函數(shù)指針賦給它。   4、關(guān)于const修飾符 當(dāng)const遇到指針,麻煩事就來了,看:const int* p; int* const p; const int* const p; 這三個(gè)表達(dá)式,第一個(gè)表示p是一個(gè)指針,p本身平凡無比,但是p所指向的對(duì)象是一個(gè)特殊的對(duì)象--整型常量;第二個(gè)表示:這個(gè)p指針不是一個(gè)普通的指針,它是個(gè)常量指針,即只能對(duì)其初始化,而不能賦值,另外,這個(gè)指針?biāo)赶虻膶?duì)象是一平凡的int型變量;第三個(gè)則結(jié)合了前兩者:指針和指向的對(duì)象都非同尋常,都是常量。 有了const,賦值的問題就變得麻煩起來, 首先,對(duì)于 const int* p;這兒由于p指向的對(duì)象是個(gè)常量,所以在通過p來引用這個(gè)對(duì)象的時(shí)候不可對(duì)其進(jìn)行賦值!對(duì)于一個(gè)常量對(duì)象,不可以用普通的指針指向,而必須用這種指向常量的指針,原因很簡(jiǎn)單,通過普通指針可以改變指向的那個(gè)值,但是對(duì)于一個(gè)非常量對(duì)象,即普通變量,可不可以將其地址賦給指向常量的指針呢?是可以的,但是一旦這樣指向之后,由于這個(gè)指針本身定義的是指向常量的指針,因而編譯器統(tǒng)一認(rèn)為其是指向變量的,因而此時(shí)不可以通過該指針修改所指向的對(duì)象的值。 第二,對(duì)于 int* const p;這兒p本身是個(gè)常量指針,所以根本就不能賦值,所以不存在賦值的問題。不可以用常量對(duì)其進(jìn)行初始化,因?yàn)檫@個(gè)指針不是指向常量的;只能用變量對(duì)其初始化。 第三,對(duì)于 const int* const p;這兒,只能初始化,不能賦值??梢岳贸A窟M(jìn)行初始化;也可以利用變量對(duì)其初始化,不過不可以利用該指針對(duì)該變量進(jìn)行賦值。   const int* p這種指向常量對(duì)象的指針常用來用作某些函數(shù)的形參,用意是從編譯器的角度防止用戶在函數(shù)中將傳遞進(jìn)去的參數(shù)修改,雖然用戶本身也可以避免,但是這樣更可靠一點(diǎn)--當(dāng)用戶不小心作出修改實(shí)參的行為時(shí),編譯器發(fā)現(xiàn)并阻止這種行為。   this指針是const xx* const型的。   5、函數(shù)與指針 指向函數(shù)的指針:可以利用它代替函數(shù)名來調(diào)用函數(shù)。 如何定義函數(shù)指針,由于一個(gè)程序中可以用多個(gè)函數(shù)名相同的情形(即函數(shù)的重載),因而,定義函數(shù)指針的時(shí)候,必須包含函數(shù)的參數(shù),這樣才能準(zhǔn)確地將指針指向某函數(shù)。 定義:int (*p)(const char*, int); 表示p是一個(gè)指向函數(shù)的指針,該函數(shù)的兩個(gè)參數(shù)為const char* 和int,另外該函數(shù)返回int型值。 容易混淆的是:int *p(const char *, int); 缺少了一個(gè)括號(hào),此時(shí)編譯器的解釋是 int* p(const char*, int);即其含義是一個(gè)函數(shù)的聲明,函數(shù)名為p,返回一個(gè)指向int型的指針。那么 int* (*p)(const char*, int);則是定義了一個(gè)函數(shù)指針p,它指向一個(gè)函數(shù),該函數(shù)的兩個(gè)參數(shù)為const char*和int,該函數(shù)返回一個(gè)指向int型的指針   函數(shù)指針的初始化與初始化: 函數(shù)名如同數(shù)組名,編譯器將其解釋為指向該類型函數(shù)的指針,故而,可以領(lǐng)用函數(shù)名,或者&函數(shù)名對(duì)函數(shù)指針進(jìn)行初始化或者賦值,另外,可以用另一個(gè)函數(shù)指針對(duì)該指針進(jìn)行初始化以及賦值。重要的一點(diǎn)是指針與函數(shù)名,指針與指針必須具有完全相同的參數(shù)表和返回類型(必須完全完全一樣,任何一點(diǎn)不同都不可以)。不存在隱式的類型轉(zhuǎn)換,用戶必須保證完全的一致性。 初始化或者賦值為0,表示不指向任何函數(shù)。   利用函數(shù)指針調(diào)用函數(shù)是可以p(x,y)這樣調(diào)用,也可以(*p)(x,y)這樣調(diào)用,前提是p已經(jīng)正確的賦值或者初始化。   函數(shù)返回指針:可以返回一個(gè)非基本類型的對(duì)象。   6、數(shù)組與指針 int a[3] = {1,2,3}; 考慮 a,a[0], &a, 以及 &a[0]這三個(gè)表達(dá)式的含義: 首先這三個(gè)表達(dá)式的數(shù)值結(jié)果是一樣的--數(shù)組的首地址(即數(shù)組中第0個(gè)元素的地址),但是編譯器對(duì)三者的解釋不同: 對(duì)于a,編譯器將其解釋為一個(gè)指針,指向的是一個(gè)整型數(shù)據(jù),因而利用a+1即指向數(shù)組中的第一的元素,a+2指向第二個(gè)元素。 對(duì)于a這個(gè)指針有些特殊的性質(zhì): a不是一個(gè)普通的指針,它同時(shí)是一個(gè)數(shù)組名,即關(guān)聯(lián)了一個(gè)數(shù)組,因而某些性質(zhì)上與普通的指針不同。 普通的指針可以被賦值,即可以用一個(gè)地址或者另一個(gè)指針修改當(dāng)前指針的指向,然而對(duì)于a這種關(guān)聯(lián)了一個(gè)數(shù)組的指針,如果允許這樣賦值的話,那么數(shù)組中的元素將無法被訪問,所以不允許對(duì)數(shù)組名代表的指針進(jìn)行賦值。在這一點(diǎn)上a相當(dāng)于指針常量,即只能被初始化,不可以進(jìn)行賦值。   雖然a不可以被賦值,但是將a賦給其他的元素是完全可以的,這一點(diǎn)同普通的指針沒有不同。 綜上,a相當(dāng)于一個(gè)指針常量。(type* const型的)   本質(zhì)上a[i]操作被編譯器解釋為*(a+i)操作,即[]運(yùn)算符是通過數(shù)組名指針實(shí)現(xiàn)的,因而&a[0]的含義即&(*a),顯然對(duì)一個(gè)指針先*(解引用),再&(引用),等價(jià)于什么都沒做,還是這個(gè)指針本身,因而a完全等價(jià)于&a[o],--(&a[0])[i]等價(jià)于a[i],形式有點(diǎn)詭異,呵呵。而對(duì)于&a這個(gè)表達(dá)式,奇怪的是這個(gè)也是數(shù)組的首地址,那么就是說,這個(gè)數(shù)組的首地址中存放了一個(gè)指針常量(即數(shù)組名),但是數(shù)組的首地址中不是存放的一個(gè)int型的數(shù)字嗎?這是怎么回事呢?難道一個(gè)地址能存放兩個(gè)東西? 暫時(shí)無法解釋,可以這樣認(rèn)為編譯器發(fā)現(xiàn)這種&和數(shù)組名的結(jié)合運(yùn)算時(shí),即返回?cái)?shù)組首地址,只不過,這是,這僅僅是個(gè)純粹的地址,它不再具有指針的特性,即編譯器不再將其解釋為指針,用戶不可以通過+1運(yùn)算來訪問下一個(gè)數(shù)組元素。它的+1就是數(shù)學(xué)上的+1。   當(dāng)數(shù)組變?yōu)槎嗑S,問題變成怎么樣了呢? 考慮二維數(shù)組 int b[4][3] = {{1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}}; b,&b, b[0], &b[0], &b[0][0]幾個(gè)表達(dá)式的含義: 首先,c++中數(shù)組元素的存放是以行序?yàn)橹餍颍吹谝欢未娣诺谝恍械臄?shù)據(jù),第二段存放第二行的數(shù)據(jù),....,如此。 首先考慮數(shù)組名b,編譯器同樣將數(shù)組名b解釋為一個(gè)指針,但是顯然這個(gè)指針不是普通的指針。這個(gè)b指向數(shù)組所有元素的首地址,這一點(diǎn)是勿庸置疑的,那么這個(gè)指針一步跨越的內(nèi)存是多大呢?在本例中,b一步跨越12個(gè)字節(jié),即b一步跨越數(shù)組中的一行元素,實(shí)際上b是一個(gè)指針的指針,或者說指向指針的指針,即b所指向的內(nèi)容是一個(gè)指針,(同樣對(duì)于b+1,b+2),b[i][j]這種訪問方式本質(zhì)上即:先通過+i,將指針跳躍到第i行,從而獲得了指向第i行首地址的指針b[i],然后通過這個(gè)指針,再通過+j,跳躍j步,到達(dá)了第j個(gè)元素,即找到第i行,第j列的元素。 所以b是指針的指針,b[i]是指針,這兒,b[i]類似于一維中的a。 那么&b呢?&b仍然是數(shù)組的首地址,但是跟一維類似的是,這是個(gè)純粹的地址,不再具有指針的特性,它的+1就是數(shù)學(xué)上的+1,不可以利用+1來訪問下一個(gè)元素。同樣的道理對(duì)于&b[i],&運(yùn)算符加上之后,本來是作為指針的b[i]被剝奪的指針的資格,返回一個(gè)純粹的地址。 實(shí)際上,由于[]本質(zhì)上是對(duì)指針的解引用,那么我們?cè)L問數(shù)組元素時(shí)可以不拘于a[i][j]這種方式,可以這樣:(*(a+i))[j], 或者*(a[i]+j),或者 *(*(a+i)+j),這幾種寫法是等價(jià)的。 對(duì)于&b[i][j]呢?我們把b[i][j]換一種寫法,寫成*(*(b+i)+j),這樣問題就容易看清楚了,原來的*b[i][j]就等價(jià)于&(*(*(b+i)+j)),我們可以把最外層的括號(hào)脫掉,就成了*(b+i)+j,即b[i]+j,顯然這是一個(gè)指針,指向第i行,第j列元素的指針,對(duì)該指針的解釋是一次跨越一個(gè)int型的數(shù)據(jù)。   讓我們?cè)僮儜B(tài)一點(diǎn),考慮三維的情形,雖然三維的數(shù)組不多見,還是考慮一下吧,畢竟空間的坐標(biāo)是用三維表示的。 int c[2][3][4] = {{{1,2,3,4},{5,6,7,8},{9,10,11,12}}, {{13,14,15,16},{17,18,19,20},{21,22,23,24}}}; 首先,數(shù)組名c,編譯器將c解釋為一個(gè)指針,指向數(shù)組的首地址,由于行序是主序,所以,該指針一步跨越12個(gè)整型數(shù),共48個(gè)字節(jié),實(shí)際上即跨越了一個(gè)二維數(shù)組。 對(duì)于&c,跟一維二維的情形類似,是一個(gè)純粹的地址. c[i]呢?可以推測(cè),c[i]與二維中的b類似,即指向指針的指針,c[i]一步跨越4個(gè)整數(shù),16個(gè)字節(jié)。c[i]是指向指針的指針,那么c便是指向指向指針的指針的指針(暈~)。 c[i]亦等價(jià)于*(c+i) 至于c[i][j],這才是真正的int型的指針,即指向真實(shí)數(shù)據(jù)的指針,一步跨越一個(gè)int型,4個(gè)字節(jié)。跟二維類似,對(duì)于&c[i][j],編譯器返回一個(gè)地址,雖然跟c[i][j]的值一樣,但是只是一個(gè)純粹的地址,跨越單元為一個(gè)字節(jié)。 對(duì)于c[i][j][k],不需要廢話,對(duì)于&c[i][j][k],這是一個(gè)地址嗎?這是一個(gè)指針嗎?我們還是要借助[]的另一種表示方法:c[i][j][k]等價(jià)于*(*(*(c+i)+j)+k),那么&c[i][j][k]就等價(jià)于*(*(c+i)+j)+k,即c[i][j]+k,即指向第(i,j,k)個(gè)元素的指針,一步跨越單元為一個(gè)int型。 讓我們來看一看,尋找第(i,j,k)個(gè)元素有哪些寫法: 1、c[i][j][k] 2、*(c[i][j]+k) 3、*(*(c[i]+j)+k) 4、*(*(*(c+i)+j)+k) 5、(*(c+i))[j][k] 6、(*(*(c+i)+j))[k] 7、*((*(c+i))[j]+k) 8、(*(c[i]+j))[k] 可見,共八種寫法,實(shí)際上就是一共有三個(gè)解引用,選擇用[]還是用*,這樣,總共有8個(gè)組合。(那么二維的就是4種,一維的2種)   7、typedef與指針 typedef似乎很簡(jiǎn)單,如typedef int integer;然而,這些簡(jiǎn)單的typedef語句容易讓人產(chǎn)生一種誤解,typedef就是一種宏替換,把后面的自定義類型替換成前面的已知類型,事實(shí)是這樣的嗎?顯然不是! 考慮這樣的問題:如何定義一個(gè)指向整型的指針類型?如何定義一個(gè)函數(shù)指針類型? 第一個(gè)問題很簡(jiǎn)單:typedef int* int_pointer;即可,對(duì)于第二個(gè)問題,似乎就沒有那么簡(jiǎn)單了,首先,看函數(shù)指針的定義方法:int (*p)(const&, int); 這個(gè)p指向的函數(shù)必須返回int,形參必須是const&和int。現(xiàn)在要將這種指針類型命名為func_pointer,其定義的方法如下: typedef int (*func_pointer)(const&, int); 可以這樣來理解:typedef int integer;將typedef去掉,那就是個(gè)變量的定義,這兒即定義了一個(gè)int型的變量integer,考慮這個(gè)integer是什么類型的,那么這個(gè)typedef語句就是將integer定義為這個(gè)類型的。將typedef int (*func_pointer)(const&, int);中的typedef去掉,就成了一個(gè)函數(shù)指針定義,即func_pointer被定義為函數(shù)指針類型變量,那么原來的typedef即將func_pointer定義為函數(shù)指針類型。   8、函數(shù),數(shù)組與指針 int (*testCases[10])(); 這個(gè)表達(dá)式是什么意思?指針,數(shù)組,函數(shù)糅合在了一起問題變得復(fù)雜起來。它定義了數(shù)組,testCases[10],數(shù)組中的元素是函數(shù)指針,函數(shù)指針的類型是 int (*)(); 怎么來理解這種定義呢?首先考慮數(shù)組的定義,數(shù)組的定義一般模式是: 類型 數(shù)組名[大小]; 考慮這個(gè)表達(dá)式,似乎是定義了一個(gè)數(shù)組,但是數(shù)組名[大小]被夾在了中間,那么類型是什么呢,發(fā)現(xiàn)類型并不是簡(jiǎn)單的數(shù)據(jù)類型,而是一個(gè)函數(shù)指針類型int (*p)(),這個(gè)函數(shù)沒有參數(shù),返回int型。從而這個(gè)表達(dá)式的含義是:定義了一個(gè)函數(shù)指針型的數(shù)組,大小是10。 可以利用typedef來簡(jiǎn)化這種定義: typedef int (*PFV)(); PFV testCases[10];   其實(shí)int (*testCases[10])();這兒我們定義了一個(gè)函數(shù)指針數(shù)組,數(shù)組是主體。 下面考慮這樣的問題:如何定義一個(gè)指向數(shù)組的指針? 指向數(shù)組的指針,好像比較新鮮,所謂指向數(shù)組的指針,即指針的一步跨越是一個(gè)數(shù)組,跟指向整型的指針一步跨越一個(gè)整型一個(gè)道理。事實(shí)上前面已經(jīng)碰到了指向數(shù)組的指針,如二維數(shù)組名,實(shí)際上就是一個(gè)指向數(shù)組的指針,它一次跨越一行的數(shù)據(jù),實(shí)際上即是跨越了一個(gè)一維數(shù)組,而三維數(shù)組名呢,也是一個(gè)指向數(shù)組的指針,它一次跨越的是低維組成的一個(gè)二維數(shù)組。 數(shù)組指針(即指向數(shù)組的指針)的定義: int (*ptr)[3]; 這個(gè)表達(dá)式定義了一個(gè)數(shù)組指針ptr,ptr一次跨越一個(gè)由3個(gè)int型組成的一維數(shù)組。發(fā)現(xiàn)其定義的方式與函數(shù)指針定義的方式很相似,只是把()換作了[]。 更進(jìn)一步,如果要定義一個(gè)指向數(shù)組的指針,而數(shù)組中的元素不是簡(jiǎn)單的int型,而是比較復(fù)雜的類型,那該如何定義呢?事實(shí)上數(shù)組指針這種東西就已經(jīng)夠稀有的了,一般編程絕對(duì)不會(huì)用到,我們只需要能讀懂一些比較復(fù)雜的東西就行了,自己沒有必要構(gòu)造這么復(fù)雜的類型。   比較復(fù)雜的表達(dá)式:      1、int (*(*(*p())[])())[]; 首先,根據(jù)p()判斷p是一個(gè)函數(shù),再根據(jù)p()前面的*號(hào)判斷該函數(shù)返回一個(gè)指針,下面就看這個(gè)指針指向的是什么類新了,我們可以把*p()替換成一個(gè)*pointer,這個(gè)pointer就是函數(shù)p返回的指針,那么就成了int (*(*(*pointer)[])())[];再根據(jù)(*pointer)[],這說明了指針pointer是指向的一個(gè)數(shù)組,那么這個(gè)數(shù)組中的元素是什么類型呢?由于數(shù)組名實(shí)際上就是個(gè)指針,我們把(*pointer)[](即(*p())[])替換成一個(gè)array,這樣就成了 int (*(*array)())[];發(fā)現(xiàn)array是一個(gè)函數(shù)指針,從而數(shù)組中的每個(gè)元素是函數(shù)指針,而這個(gè)函數(shù)呢,又返回一個(gè)指針類型,把(*array)()用func代替,就成了int (*func)[];這說明了func函數(shù)返回的是指向數(shù)組的指針,數(shù)組中的元素是int型。 這個(gè)表達(dá)式夠酷!!! 2、p = (int( * (*)[20])[10])q; 這是一個(gè)強(qiáng)制類型轉(zhuǎn)換,q被強(qiáng)制類型轉(zhuǎn)換成一個(gè)這樣的指針類型,這個(gè)指針呢直線一個(gè)具有20個(gè)元素的數(shù)組,這個(gè)數(shù)組中的元素也是指針,是指向另外一種數(shù)組,這種數(shù)組是含有10個(gè)int型數(shù)據(jù)的一維數(shù)組。   可見,分析復(fù)雜的表達(dá)式時(shí)(所謂復(fù)雜,即糅合了指針,數(shù)組,函數(shù)三樣,缺少了一樣就不會(huì)復(fù)雜了),從括號(hào)的最里層做起,最里層的東西是復(fù)雜表達(dá)式的“根節(jié)點(diǎn)”,然后一層一層脫,脫的時(shí)候,是這樣的,比如里層是個(gè)數(shù)組,那么就是說這個(gè)數(shù)組的元素是什么呢,那就是外層的東西,如果里層是個(gè)有返回值的函數(shù),那么就是說這個(gè)函數(shù)返回什么值呢?那就是外層的東西,就這樣一層一層地把表達(dá)式解析清楚。     關(guān)于typedef還有一些要說的: typedef int (*PFV)(); 這是定義了一個(gè)函數(shù)指針,那么PFV p;就可以定義了一個(gè)指向函數(shù)的指針。 typedef int (*p[10])(); 這是把p定義為函數(shù)指針數(shù)組,那么 p array;語句就可以定義了一個(gè)函數(shù)指針數(shù)組,數(shù)組名即為array,array這個(gè)數(shù)組含10個(gè)元素。 typedef int (*parray)[3];這是定義了一個(gè)指向整型數(shù)組的指針,那么 parray ptr;就定義了一個(gè)指向數(shù)組的指針。如何對(duì)這個(gè)ptr賦值或者初始化呢?事實(shí)上,是通過二維數(shù)組名來對(duì)其進(jìn)行賦值(初始化)的,因?yàn)槎S數(shù)組名作為指針來講,就是一個(gè)指向數(shù)組的指針,一次跨越一個(gè)數(shù)組。 typedef int a[3][3]; 這個(gè)語句什么意思呢?這是把a(bǔ)定義為一個(gè)3*3的整型數(shù)組類型。當(dāng)a b = {1}時(shí)就完成了一個(gè)3×3的整型數(shù)組的定義初始化的工作。 同樣,簡(jiǎn)單一點(diǎn) typedef int a[3];這個(gè)語句是把a(bǔ)定義為一個(gè)一維數(shù)組類型。 typedef void func(int); 這個(gè)語句定義了一個(gè)函數(shù)類型。通過這個(gè)typedef,我們可以比較清晰地定義出函數(shù)指針,func* p;即可。   typedef char* string; const string str; 這個(gè)str是什么類型的呢?const char * str,即指向常量的指針類型?事實(shí)上,答案有些不可思議,str是一個(gè)常量指針,而不是指針常量,即const修飾符針對(duì)的是指針,而不是char。   9、引用與指針 引用類似與指針常量,只可初始化,不可賦值。別名(alias)是引用(reference)的另一種叫法。通過引用可以間接地操操縱對(duì)象。 常量引用,即類似與指向常量的常量指針,對(duì)常量引用的初始化,有一點(diǎn)特殊,可以用常量,變量,甚至是常數(shù)對(duì)其進(jìn)行初始化。 對(duì)于用變量初始化常量引用,那么不能通過這個(gè)引用修改這個(gè)變量,但是本來的變量名可以。這一點(diǎn),類似變量地址賦給常量指針。通過常量指針不可以修改變量,但是變量自身的變量名可以。 可以有指針的引用,如 int a = 1; int* p = &a; int* &r = p; 那么r就成了指針p的引用。如果是const int* p = &a;說明是常量指針,那么定義引用的時(shí)候,就要如此定義,const int* &r = p;這個(gè)語句說明r是一個(gè)指針的引用,這個(gè)指針是個(gè)指向常量的指針變量,而并不意味著這個(gè)引用是個(gè)常量引用。那如果說這個(gè)指針不僅僅是常量指針,而且是個(gè)指針常量,即const int* const p;那么定義引用時(shí)要注意應(yīng)該const int* const &r = p;這樣表明該引用是個(gè)常量引用。這里有一個(gè)問題當(dāng)用一個(gè)變量的地址初始化引用時(shí)如,int a = 22; int* const &pi_ref = &a;需要注意應(yīng)該定以為常量引用,因?yàn)?amp;a不是變量名,而是類似常數(shù)。而若const int a = 22;則應(yīng)該const int* const &pi_ref = &a;即中間的const是用來定義常量引用的,而前面的const反映的是引用指向的對(duì)象(指針)是指向的的const對(duì)象。   我們有對(duì)象名,或者對(duì)象的指針,這些都可以操縱對(duì)象,為何要引入引用的概念呢? 事實(shí)上,引用最常用的是用作函數(shù)的形參。要在函數(shù)中操縱一個(gè)外部對(duì)象的時(shí)候,利用引用是一個(gè)好辦法。   關(guān)于引用 首先,引用只可初始化,不可被賦值,因?yàn)?,被初始化后的引用,就成了被引用的?duì)象的別名,再行賦值,就不是對(duì)引用本身的賦值了,而是對(duì)所引用的對(duì)象的賦值了。

網(wǎng)站題目:星號(hào)的秘密-創(chuàng)新互聯(lián)
文章出自:http://www.muchs.cn/article18/dsscdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、軟件開發(fā)、小程序開發(fā)、App設(shè)計(jì)、網(wǎng)站導(dǎo)航、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管