1.指標和引用的定義和性質區別:
的變數實質上是同乙個東西,只不過是原變數的乙個別名而已。如:
int a=1;int *p=&a;
int a=1;int &b=a;
上面定義了乙個整形變數和乙個指標變數p,該指標變數指向a的儲存單元,即p的值是a儲存單元的位址。
而下面2句定義了乙個整形變數a和這個整形a的引用b,事實上a和b是同乙個東西,在記憶體占有同乙個儲存單
元。(2)引用不可以為空,當被建立的時候,必須初始化,而指標可以是空值,可以在任何時候被初始化。
(3)可以有const指標,但是沒有const引用;
(4)指標可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的)
(5)指標的值可以為空,但是引用的值不能為null,並且引用在定義的時候必須初始化;
(6)指標的值在初始化後可以改變,即指向其它的儲存單元,而引用在進行初始化後就不會再改變了。
(7)」sizeof引用」得到的是所指向的變數(物件)的大小,而」sizeof指標」得到的是指標本身的大小;
(8)指標和引用的自增(++)運算意義不一樣;
(9)如果返回動態記憶體分配的物件或者記憶體,必須使用指標,引用可能引起記憶體洩漏;
2.指標和引用作為函式引數進行傳遞時的區別。
(1)指標作為引數進行傳遞:
#include
#include
using
namespace
std;
void swap_int(int *a,int *b)
void test(int *p)
執行後的結果如下:
結果為2 1;
swap_int函式使用指標傳遞引數,可以實現對實參進行改變的目的,是因為傳遞過來的是實參的位址,因此
使用*a實際上是取儲存實參的記憶體單元裡的資料,即是對實參進行改變,因此可以達到目的。呼叫test函式
執行結果為:
0x6afecc 1
指標p為null
在main函式中宣告了乙個指標p,並賦值為null,當呼叫test函式時,事實上傳遞的也是位址,只不過傳遞
的是指位址。也就是說將指標作為引數進行傳遞時,事實上也是值傳遞,只不過傳遞的是位址。當把指標作
為引數進行傳遞時,也是將實參的乙個拷貝傳遞給形參,即上面程式main函式中的p何test函式中使用的p不
是同乙個變數,儲存2個變數p的單元也不相同(只是2個p指向同乙個儲存單元),那麼在test函式中對p進
行修改,並不會影響到main函式中的p的值。如果要想達到也同時修改的目的的話,就得使用引用了。
(2)將引用作為函式的引數進行傳遞。
在講引用作為函式引數進行傳遞時,實質上傳遞的是實參本身,即傳遞進來的不是實參的乙個拷貝,因此對
形參的修改其實是對實參的修改,所以在用引用進行引數傳遞時,不僅節約時間,而且可以節約空間。
#include
#include
using
namespace
std;
void test(int &a)
執行後的結果如下:
所以在引用進行引數傳遞時,事實上傳遞的是實參本身而不是拷貝副本。所以在上述要達到同時修改指標的
目的的話,就得使用引用了。
#include
#include
using
namespace
std;
void test(int *&p)
執行後的結果如下:
C 中 (指標引用)和 (指標)的區別
很久之前學的c 了,複習一下,指標是乙個存放位址的變數,而指標引用指的是這個變數的引用,眾所周知c 中如果引數不是引用的話會呼叫引數物件的拷貝建構函式,所以如果有需求想改變指標所指的物件 換句話說,就是要改變指標裡面存的位址 就要使用指標引用,在網上看到大佬的 簡單明瞭,如下 include usi...
C 中指標引用和指標的區別
指標 是位址 即記憶體單元的編號 指標變數 是乙個存放位址的變數 指標引用 指的是這個指標變數的引用 眾所周知c 中如果引數不是引用的話會呼叫引數物件的 拷貝建構函式 重新開闢一塊一模一樣的記憶體空間 所以如想改變指標變數裡面存的位址,就要使用指標引用 讀 前請先搞懂 二級指標 指標的指標 指向指標...
C 中指標和引用的區別
引用和指標 相同點 1.都是位址的概念 指標指向一塊記憶體,它的內容是所指記憶體的位址 引用是某塊記憶體的別名。區別 1.指標是乙個實體,而引用僅是個別名 2.引用使用時無需解引用 指標需要解引用 3.引用只能在定義時被初始化一次,之後不可變 指標可變 引用 從一而終 4.引用沒有 const,指標...