c 中的指標與引用

2021-08-17 01:42:35 字數 1479 閱讀 8974

引用:不是定義乙個變數,而是給已經存在的變數取乙個別名,所以引用一定要初始化

定義的格式:型別& 引用名=已定義過的變數名

引用的特點:1.變數可以有多個別名

2.引用必須要初始化

3.乙個引用不可為多個變數,並且不可變

4.在引用是可以加限制,但不能少限制

乙個例子:

int a=100;

int &b=a;

int &c=a;

int c=10;

b=c;//簡單的賦值動作

&:引用

2.const int& a=0;

const int& b=a;

常量具有常性,所以在引用是必須要要匹配,使用const修飾

引用的時候型別必須匹配

3.引用的應用

0.用引用做形參,

const引用傳參時不能被改變(我們在傳參時盡量使用const,保證變數不能被修改值)(從一而終)

1.用引用做返回值的時候,若為值返回,為臨時變數返回,所以返回值的引用需加const,

用引用返回的時候不開闢臨時空間

我們可以看乙個栗子 ,分別是用引用做返回值和引數的時候

首先是做返回值的時候

我們可以看到當引用返回值得時候,我們在呼叫完第乙個add函式在之後,函式棧楨銷毀,而ret代表的是哪個函式返回值的那塊空間的引用,即使那塊棧楨已經被銷毀,但是那塊空間的的別名ret依舊存在,它依然是那塊空間得別名,當我們第二次呼叫add函式的時剛好在剛剛已經銷毀的那塊空間上又建立了乙個棧楨,而返回值剛好還是ret引用的那塊空間,所以當我們執行完第二個add函式的時候,ret的值就會改變,而且當我們呼叫完第二個add函式之後,我們又會發現,ret的值又改變了,變成了乙個隨機數,,因為剛剛的棧楨又被銷毀了,編譯器給上面置了乙個隨機值,標記此塊空間無用

總的一句,

就是將這個結果的位址通過臨時變數傳給main函式中的ret

引用做引數的時候

此時我們又發現ret沒有變,因為我們只是將這兩個引數的別名傳進函式,然後進行計算之後

將結果的值通過臨時變數(暫存器)傳給main函式中的ret

所以ret不會變

所以不要返回乙個臨時變數的引用,但是如果不是臨時變數,那麼盡量用引用,可以節省空間

4.指標和引用的區別:

指標的大小位元組和編譯器的位數有關

在語法上,引用不開闢空間,指標開闢空間

引用必須初始化,指標可以不用初始化

引用不能變,指標可以變

引用相對於指標更安全,指標相對於引用來說更靈活

我們一定要明白,引用不開闢空間知識相對於語法而言,但其實我們對底層而言,編譯器要實現這個引用,其實還是需要開闢空間的的來儲存這個引用所指向空間的位址

C 中的指標與引用

1.物件指標和一般的指標的大小都只與作業系統有關,32位系統就是4位元組,64位就是8位元組 2.c 在建立物件的時候 會給物件的每乙個成員變數分配一定的儲存空間,以存放其成員 注意位元組對齊問題 3.所以乙個物件的大小 就是其成員變數的總大小 4.指向物件成員的指標 p t1.hour 將物件t1...

C 中的引用與指標

c語言中函式有兩種傳參的方式 傳值和傳址。傳值方式,在函式呼叫過程中會生成乙份臨時變數用形參代替,最終把實參的值傳遞給新分配的臨時變數,即形參。它的優點是避免了函式呼叫的 卻無法改變形參的值。如果要改變實參的值,只能通過位址傳參。例如 傳值 void swap int left,int right ...

C 中的指標 引用 指標引用

在c 指標的用處很大,可以快讀的訪問位址空間,而且本身不佔太大記憶體。指標操作在引數傳遞的時候非常方便。既可以作為傳入引數,又可以作為返回值。但是可不可作為函式的傳出引數呢?下面通過乙個例子來說明。教室裡面包含多個老師,每個老師管理多個學生 學生類 pragma once include class...