C 引用的實質理解

2021-09-30 05:09:33 字數 2111 閱讀 4237

引用的定義:在型別和識別符號之間加上乙個取位址符,說明該識別符號為指定型別的引用

如: int &ref = num;   就是ref是乙個int型的引用

引用有什麼作用呢?  看下面**就知道了:

第一行輸出 :ref = 12,num = 12

第二行輸出 :ref = 16,num = 16

第三行輸出 :ref = 18,num = 18

由上面三行輸出可以看出引用ref隨著num的值的改變而改變,再看下面的輸出

第四行輸出 :&ref = 0xbfffeb44,&num = 0xbfffeb44

當取位址符的時候可以看到引用識別符號和被引用變數的位址都是同乙個;至止明白引用的實質就是給某個變數定義了乙個別名,也就是說別引用和引用的變數共用同一塊記憶體空間

下面我們看如果給ref賦值的話會發生什麼情況:

第五行輸出 :ref = 21,num = 21

可以看出給ref賦值的同時 ,也改變了被引用的num的值,這裡

注意的是只把num1的值傳給了ref,而不是將ref變成了num1 的引用...通過下面的位址輸出結果可以知曉~~

第六行輸出 :&ref = 0xbfffeb44,&num = 0xbfffeb44,&num1 = oxbfffeb40

通過第六行的輸出可以知道:引用一旦初始化為某乙個變數,那麼該

引用不可能成為另外變數的引用;

也就是說引用只可以在初始化的時候賦值初始化以後只能發生數值的變化,不能發生源的變化

補充:引用是乙個變數,但和普通變數不同的是在定義的時候引用一定要初始化

即不能只定義: int &ref  ;      //不初始化賦值是錯誤的

下面給出個例子簡單的看下引用應用的例子:

執行輸出結果:

num1 = 21;num2 = 12//指標傳遞引數

num1 = 21;num2 = 12//引用傳遞引數

在這裡肯定有人認為這引用跟指標不是一樣的麼,也是取變數的位址,通過位址來操作位址所指空間的資料麼...   

下面是引用與指標的四大區別:

非空區別

在任何情況下都不能使用指向空值的引用(繼上面引用要初始化...),乙個引用必須總是指向某些物件.

不存在批向空值的引用這個事實意味著使用的**效率要比使用指標搞

合法性區別

在使用引用之前不需要測試他的合法性;

相反,指標總是被測試,如:防止其為空等

可修改區別

指標可以被重新賦值以指向另外乙個不同的物件

;引用則總是指向初始化被指定的物件,以後不能改變,但指定物件的內容可變化

應用性區別

在兩種情況下應用指標:一是考慮到存在不指向任何物件的可能; 二是需要在不同的時刻指向不同的物件.如果總是指向乙個物件並且一旦指向乙個物件 就不會改變指向,應該使用引用...(有點像****跟情聖的區別...)

引用的實質

1.引用的定義 引用即 變數的別名。int a 10 int b a b 即為a的別名。2.通過引用實現資料交換 3.引用的意義 引用作為變數的別名存在,因此在一些場合可以替代指標。引用相對於指標來說具有更好的可讀性和實用性。4.引用和指標一樣所佔的記憶體空間都是4個位元組。引用在c 中本質就是乙個...

C指標的實質

最近對c c 指標特別感冒,就詳細的研究了下 看下面的定義 char a hello world char p hello world 1.什麼是位址 位址本身就是一種基本資料型別,它跟整數,浮點數,字元等基本型別是一樣的。指標不是型別,真正的型別是位址,指標只不過是儲存位址這種資料型別的變數。打個...

C 指標的引用理解

指標可以作為引數傳遞直接修改所指的變數的值,如下 void change int p int main 指標傳遞實際上也是值傳遞,傳遞的值便是指標的位址,執行 p 20後,雖然傳遞的是乙個位址的副本,但是副本的值就是變數的位址,執行後,所指向的位址的值變成了20,達到了修改變數值的目的。所以,當需要...