指標和引用的區別

2021-07-11 23:22:42 字數 1558 閱讀 6557

首先看一下這兩者的定義

指標:是程式語言中的乙個物件,利用位址,它的值直接指向(points to)存在電腦儲存器中另乙個地方的值。由於通過位址能找到所需的變數單元,可以說,位址指向該變數單元。

引用:是某個已知變數 或物件的別名,它不是變數,自身沒有值和位址,不占用記憶體空間。

一:指標和引用的區別

1. 引用必須被初始化,而指標不初始化也沒有太大的問題。

引用是乙個已知物件或變數的別名,而且它不佔記憶體空間,如果只是單單乙個int&a,是沒有任何意義的。

指標不一樣,int*p;就是在記憶體中開闢了一塊空間,用來存放位址。位址可以在剛開闢空間的時候放入,也可以在需要的時候放入。

乙個引用只能對應著乙個變數(引用是專一的),乙個指標變數卻可以存放多個變數或物件的位址(指標是多變的)。

前面也說了,引用是乙個乙個變數或物件的別名。那麼比如張三的別名是阿三,如果李四的別名也叫阿三,當有人叫阿三的時候,到底哪個阿三才會回應呢?這就容易引起混淆了。

指標是一塊空間,裡面的內容是可以替換的,指標裡存的是a的位址,通過指標你可以訪問到a,當有需要了,你把指標的值改為了b,你同意還是可以范文到b。

不存在空值的引用,但存在空值的指標

引用是乙個已知物件或變數的別名,當這個變數都不存在,哪來的別名。

引用相對於指標更加安全

引用在定義的時候就被初始化了,並且引用的物件不可改變。正是因為這點,程式中不必對其進行檢測。

指標是多變的,很多時候要對它進行判空,因為空指標是不安全的。而且指標的值容易發生變化,在你不經意間,它就已經變成其他的值了。

過載操作符的時候必須要用到引用。

最典型的就是 的過載,因為陣列的返回值是可以作為左值的,而作為左值表示的是一塊空間,是可以賦值的。這時就必須用到引用。

int& array::operator(int i)//可能作為左值,所以要返回引用

else

return arr[i];

}int main()

return

0;}

二:指標和 引用的相同點

1. 指標和引用在底層的實現是一樣的

指標

int a = 1;

int*pointer = &a;

return

0;

反彙編

引用

int a = 1;

int&b = a;

return

0;

反彙編

int&a=b類似於指標中的int *const p=&b(指標p的值不可變)

const int&a=b類似於指標中的const int*const p=&b(p和p指向的內容都不可變)

引用中乙個變數和它的引用必須是同一型別。指標中乙個變數和它的指標必須是同一型別

指標引用和引用指標的區別

c 在傳參的過程中,指標 和指標引用 是有區別的。雖然,我們往往可以通過傳指標然後通過間址訪問來修改指標所指向物件的值,同樣,通過引用也可以直接修改物件的值。但是,當傳指標的時候有乙個問題,就是,我們雖然可以通過指標來修改指標所指向物件的值,但是我們沒有不能直接修改指標的內容 也就是指標變數存放的位...

傳指標和傳指標引用的區別 指標和引用的區別(本質)

指標傳遞引數本質上是值傳遞的方式,它所傳遞的是乙個位址值。值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值...

傳指標和傳指標引用的區別 指標和引用的區別(本質)

指標傳遞引數本質上是值傳遞的方式,它所傳遞的是乙個位址值。值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值...