引用與指針有什么區(qū)別
引用與指針有什么區(qū)別
1、引用是變量的別名,,指針是變量的地址,指針變量存放著那個(gè)變量的地址2、指針是可以做算術(shù)運(yùn)算的,引用不行3、指針可以為NULL,也有常指針,二維指針,引用沒這些3、其實(shí)就是變量名與地址之間的區(qū)別,兩個(gè)除了用法上有些相似,其他沒什么太大關(guān)系。
指針和引用的區(qū)別
1.指針是一個(gè)實(shí)體,而引用僅是個(gè)別名;2.引用使用時(shí)無需解引用(*),指針需要解引用;3.引用只能在定義時(shí)被初始化一次,之后不可變;指針可變;引用“從一而終”^_^4.引用沒有const,指針有const,const的指針不可變;5.引用不能為空,指針可以為空;6.“sizeof引用”得到的是所指向的變量(對象)的大小,而“sizeof指針”得到的是指針本身(所指向的變量或?qū)ο蟮牡刂罚┑拇笮?typeid(T)==typeid(T&)恒為真,sizeof(T)==sizeof(T&)恒為真,但是當(dāng)引用作為類成員名稱時(shí),其占用空間與指針相同4個(gè)字節(jié)(沒找到標(biāo)準(zhǔn)的規(guī)定)。
引用和指針有何區(qū)別?何時(shí)只能使用指針而不能使用引用?
引用與指針區(qū)別:引用只是取得數(shù)據(jù),無權(quán)修改,句柄就是一種引用的方式;指針是直接指向內(nèi)存的,可以修改數(shù)據(jù)的。引用訪問一個(gè)變量是直接訪問,而指針是間接訪問。
引用是一個(gè)變量的別名,本身不單獨(dú)分配自己的內(nèi)存空間,而指針有自己的內(nèi)存空間。
引用在開始的時(shí)候就綁定到了一個(gè)內(nèi)存空間(開始必須賦初值),所以他只能是這個(gè)內(nèi)存空間的名字,而不能改成其他的,當(dāng)然可以改變這個(gè)內(nèi)存空間的值.例如int i = 3,j = 4;int &x = i;//成為i的別名x = j;//不能否認(rèn)x仍然引用i,并沒有成為j的別名,只是修改了x和j共享的內(nèi)存空間的值.這點(diǎn)與指針不同,指針在任何時(shí)刻都可以改變自己的指向。無法讓引用與其指示物分離。和指針不同,一旦引用和對象綁定,它無法再被重新指向其他對象。引用本身不是一個(gè)對象(它沒有標(biāo)識;當(dāng)試圖獲得引用的地址時(shí),你將的到它的指示物的地址;記?。阂镁褪撬闹甘疚?)。
從某種意義上來說,引用類似 int* const p 這樣的const指針(并非如 const int* p這樣的指向常量的指針)。不管有多么類似,請不要混淆引用和指針;它們完全不同。盡可能使用引用,不得已時(shí)使用指針。
當(dāng)不需要“重新指向(reseating)”時(shí),引用一般優(yōu)先于指針被選用。這通常意味著引用用于類的公有接口時(shí)更有用。引用出現(xiàn)的典型場合是對象的表面,而指針用于對象內(nèi)部。
上述的例外情況是函數(shù)的參數(shù)或返回值需要一個(gè)“臨界”的引用時(shí)。這時(shí)通常**返回/獲取一個(gè)指針,并使用 NULL指針來完成這個(gè)特殊的使命。(引用應(yīng)該總是對象的別名,而不是被解除引用的 NULL 指針)。
注意:由于在調(diào)用者的代碼處,無法提供清晰的的引用語義,所以傳統(tǒng)的 C 程序員有時(shí)并不喜歡引用。然而,當(dāng)有了一些 C++經(jīng)驗(yàn)后,你會很快認(rèn)識到這是信息隱藏的一種形式,它是有益的而不是有害的。就如同,程序員應(yīng)該針對要解決的問題寫代碼,而不是機(jī)器本身。
指針的與“引用”的區(qū)別
?指針和引用?是困擾初學(xué)者的問題之一,我們知道,指針和引用?都能夠指向一個(gè)對象(&對該對象進(jìn)行操作),那么他們之間有什么區(qū)別呢?
我們先來看定義:
指針:指針是一個(gè)特殊的變量,這個(gè)變量指向一個(gè)內(nèi)存地址,即對象存儲空間的首地址;
引用:所指向?qū)ο蟮囊粋€(gè)別名,與直接訪問對象的方式一致;
ok,看上去有點(diǎn)類似,也有些差別,我們通過代碼示例來看:
char?*p1?=?NULL;?p1?=?new?char[16];?const?char?*p2?=?\”Hello?World!\”;?p2?=?\”Now?Value?Changed!\”;?int?num?=?1;?int?&ref?=?num;?ref?=?2;?//?now?num?=?2?int?const?*p3?=?#?*p3?=?3;?/百科/?now?num?=?3
我們根據(jù)例子來說明指針和引用的幾點(diǎn)主要區(qū)別:
1.?初始化方式不同
指針初始化可以為空(line1),引用必須指向一個(gè)對象;
2.?指向改變
指針可以改變指向(line2),引用“從一而終”,引用只能改變所引用對象的值(line7);
3.?Sizeof
指針占用內(nèi)存空間,大小由所在系統(tǒng)的位數(shù)決定(比如4或者8),而引用不申請內(nèi)存空間,sizeof對應(yīng)所指對象的內(nèi)存大小;
4.?const對比
對指針來講,const?Type*?用來修飾指針(line3),所指向?qū)ο鬄槌A?,指向可以改為另一個(gè)常量(line4);
Type?const*?用來約束指針,不可以再指向其他對象,但值可以改變(line8);
來自:http://blog.csdn.net/linolzhang/article/details/54382387
區(qū)別/指針和引用的區(qū)別
指針指向一塊內(nèi)存,它的內(nèi)容是所指內(nèi)存的地址;引用是某塊內(nèi)存的別名。指針是一個(gè)實(shí)體,而引用僅是個(gè)別名;引用使用時(shí)無需解引用(*),指針需要解引用;引用只能在定義時(shí)被初始化一次,之后不可變;指針可變; 引用沒有 const,指針有 const;引用不能為空,指針可以為空;“sizeof 引用”得到的是所指向的變量(對象)的大小,而“sizeof 指針”得到的是指針本身(所指向的變量或?qū)ο蟮牡刂?的大小;指針和引用的自增(++)運(yùn)算意義不一樣;從內(nèi)存分配上看:程序?yàn)橹羔樧兞糠峙鋬?nèi)存區(qū)域,而引用不需要分配內(nèi)存區(qū)域。
C/C++語言-指針與引用的區(qū)別
一、指針: 1.指針的定義: 指針作為實(shí)體,是一個(gè)用來保存一個(gè)內(nèi)存地址的計(jì)算機(jī)語言中的變量。指針一般出現(xiàn)在比較底層的程序設(shè)計(jì)語言中,如C語言。
高層的語言如Java一般避免用指針,而是引用。
指針作為數(shù)據(jù)類型,可以從一個(gè)函數(shù)類型、一個(gè)對象類型或者一個(gè)不完備類型中導(dǎo)出。從中導(dǎo)出的數(shù)據(jù)類型稱之為被引用類型(referenced type)。指針類型描述了一種對象,其值為對被引用類型的實(shí)體的引用。 2.* 和 &符號 這個(gè)時(shí)候能改變a的值,而 改為 就無法改變a的值。
在執(zhí)行inc(&a);時(shí),系統(tǒng)在內(nèi)存分配表里增加了一行“inc 中的val”,其地址為新地址,值為&a。操作*val,即是在操作a 了。 二.引用 1.引用的定義: (1)引用就是某個(gè)目標(biāo)變量的“別名”,對應(yīng)用的操作與對變量直接操作效果完全相同。
(2)申明一個(gè)引用的時(shí)候,切記要對其進(jìn)行初始化。 2.引用的特點(diǎn): (1)傳遞引用給函數(shù)與傳遞指針的效果是一樣的。這時(shí),被調(diào)函數(shù)的形參就成為原來主調(diào)函數(shù)中的實(shí)參變量或?qū)ο蟮囊粋€(gè)別名來使用,所以在被調(diào)函數(shù)中對形參變量的操作就是對其相應(yīng)的目標(biāo)對象(在主調(diào)函數(shù)中)的操作。
(2)使用引用傳遞函數(shù)的參數(shù),在內(nèi)存中并沒有產(chǎn)生實(shí)參的副本,它是直接對實(shí)參操作;而使用一般變量傳遞函數(shù)的參數(shù),當(dāng)發(fā)生函數(shù)調(diào)用時(shí),需要給形參分配存儲單元,形參變量是實(shí)參變量的副本;如果傳遞的是對象,還將調(diào)用拷貝構(gòu)造函數(shù)。因此,當(dāng)參數(shù)傳遞的數(shù)據(jù)較大時(shí),用引用比用一般變量傳遞參數(shù)的效率和所占空間都好。 (3)使用指針作為函數(shù)的參數(shù)雖然也能達(dá)到與使用引用的效果,但是,在被調(diào)函數(shù)中同樣要給形參分配存儲單元,且需要重復(fù)使用\”*指針變量名\”的形式進(jìn)行運(yùn)算,這很容易產(chǎn)生錯(cuò)誤且程序的閱讀性較差;另一方面,在主調(diào)函數(shù)的調(diào)用點(diǎn)處,必須用變量的地址作為實(shí)參。
而引用更容易使用,更清晰。