1、指針和引用的定義和性質區別:
(1)指針:指針是一個變量,只不過這個變量存儲的是一個地址,指向內存的一個存儲單元;而引用跟原來的變量實質上是同一個東西,只不過是原變量的一個別名而已。如:
int a=1;int *p=&a;
int a=1;int &b=a;
上面定義了一個整形變量和一個指針變量p,該指針變量指向a的存儲單元,即p的值是a存儲單元的地址。
而下面2句定義了一個整形變量a和這個整形a的引用b,事實上a和b是同一個東西,在內存占有同一個存儲單元。
(2)可以有const指針,但是沒有const引用;
(3)指針可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的)
(4)指針的值可以為空,但是引用的值不能為NULL,並且引用在定義的時候必須初始化;
(5)指針的值在初始化后可以改變,即指向其它的存儲單元,而引用在進行初始化后就不會再改變了。
(6)"sizeof引用"得到的是所指向的變量(對象)的大小,而"sizeof指針"得到的是指針本身的大小;
(7)指針和引用的自增(++)運算意義不一樣;
2、指針和引用作為函數參數進行傳遞時的區別:
(1)傳引用和傳指針看上去效果一樣的,但本質上有區別:指針傳遞參數本質上是值傳遞的方式,它所傳遞的是一個地址值。值傳遞的特點是被調函數對形式參數的任何操作都是作為局部變量進行,不會影響主調函數的實參變量的值。
在值傳遞過程中,被調函數的形式參數作為被調函數的局部變量,即在棧中開辟了內存空間以存放由主調函數放進來的實參的值,前面說過,值傳遞是單向傳遞(實參->形參),賦值完畢后實參就和形參沒有任何聯系。那指針傳遞是怎么通過這個局部變量訪問實參的呢,當然是通過局部變量中存儲的地址。
既然形參和實參是相互獨立的,在沒有任何修飾形參時,形參是可以被修改的,形參指針可以指向任何地方,而且修改后就無法再訪問到實參。
(2)而在引用傳遞過程中,被調函數的形式參數雖然同樣作為局部變量在棧中開辟了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。被調函數對形參的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調函數中的實參變量。正因為如此,被調函數對形參做的任何操作都影響了主調函數中的實參變量。
引用傳遞和指針傳遞是不同的,雖然它們都是在被調函數棧空間上的一個局部變量,但是任何對於引用參數的處理都會通過一個間接尋址的方式操作到主調函數中的相關變量。而對於指針傳遞的參數,如果改變被調函數中的指針地址,它將影響不到主調函數的相關變量。
兩者都是通過地址來操作值,但是如果改變指針的值(地址),那么實參將不會受到影響(形參為局部變量)。通過編譯后,指針和引用無差別。