重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
1、指針和引用的本質(zhì)(是什么)
創(chuàng)新互聯(lián)建站一直秉承“誠信做人,踏實(shí)做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個客戶多一個朋友!為您提供成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都網(wǎng)頁設(shè)計、小程序開發(fā)、成都網(wǎng)站開發(fā)、成都網(wǎng)站制作、成都軟件開發(fā)、手機(jī)APP定制開發(fā)是成都本地專業(yè)的網(wǎng)站建設(shè)和網(wǎng)站設(shè)計公司,等你一起來見證!
(1)指針是存放內(nèi)存地址的一種變量,特殊的地方就在它存放的是內(nèi)存地址。因此,指針的大小不會像其他變量一樣變化,只跟當(dāng)前平臺相關(guān)——不同平臺內(nèi)存地址的范圍是不一樣的,32位平臺下,內(nèi)存最大為4GB,因此只需要32bit就可以存下,所以sizeof(pointer)的大小是4字節(jié)。64位平臺下,32位就不夠用了,要想內(nèi)存地址能夠都一一表示,就需要64bit(但是目前應(yīng)該沒有這么大的內(nèi)存吧?),因此sizeof(pointer)是8。
(2)引用的本質(zhì)是“變量的別名”,就是給變量又重新起了一個名字,既然是“別名”,那么就一定要有本體。
2、聲明和初始化時的區(qū)別
指針指向的是一個內(nèi)存地址, 因此可以指向一塊為0x00000000的地址,聲明時可以暫時不初始化(不推薦),即pointer = NULL;
引用是變量的別名,別名就一定對應(yīng)著一個“本名”,因此必須在聲明時就初始化,且不能初始化為空。
3、使用時區(qū)別
(1)根據(jù)聲明和初始化時二者的區(qū)別,指針在聲明周期內(nèi)隨時可能會為Null,所以使用時一定要做檢查,防止出現(xiàn)空指針、野指針的情況;而引用則不用再操這個心,只要初始化了,在哪里都可以直接使用,再也不用擔(dān)心它會不會為空什么的了。
(2)指針因?yàn)樽约捍娴氖且粋€內(nèi)存地址,既然可以存初始化(或者賦值)的地址,那么在指針生命周期內(nèi)就可以存其他的地址,只要你是同一類型(不同類型這個對應(yīng)的類型偏移不一樣)的變量,對于指針都OK。
引用作為一個變量AA的別名,在它的整個生命周期內(nèi),它只能“從一而終”,始終是第一次初始化它的那個變量的別名,在這期間任何對它的操作,都等同于對變量AA的操作。
Talk is cheap,show you my code.
/** 指針和引用的例子 **/ std::string s1 = "蘿卜"; std::string s2 = "青菜"; std::string s3 = "雞蛋"; std::string s4 = "西紅柿"; /** 指針可以初始化為空 **/ std::string *p_Str = NULL; /** 引用一開始必須初始化 **/ std::string& r_Str = s1; p_Str = &s2; std::cout<<"我是指針"<<*p_Str<
4、總結(jié)
一個不大恰當(dāng)?shù)谋扔魇牵羔樉拖袷且粋€可以(注意是可以,但未必一定)到處沾花惹草(可以隨時指向任意地址)的“渣男”;而引用則像是一個只能“從一(誰初始化就跟誰)而終”的“老實(shí)人”。
另外,根據(jù)Scott Meyers在《More Effective C++》上所講,只有當(dāng)你確定需要一開始就初始化,并且不需要再指向其他類型時 使用引用,否則你都應(yīng)該使用指針。
小弟認(rèn)識粗鄙淺薄,有不當(dāng)之處,請大佬輕拍。
以上所述是小編給大家介紹的C++中指針和引用的區(qū)別詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對創(chuàng)新互聯(lián)網(wǎng)站的支持!