在學習c語言的時候,函式傳參介紹了兩種方式,一種是傳值,另一種是傳址。傳值的時候,函式呼叫過程中會生成一種臨時變數用形參的形式代替,最終把實參的值傳遞給新分配的臨時變數。這種方式的有點很明顯,就是避免函式呼叫的***,確定無法改變形參的值,不過缺點也是這個,當需要改變形參的時候,卻無法實行。這個時候可以通過傳址,即,通過指標的傳遞來改變實參的值。
比如:最開始我們學習的交換函式。
void swap(int a,int b)//傳值
void swap(int
*a,int
*b)//傳址
不過,同樣的優點即缺點,指標可以解決這個問題,但是不安全。因此,在c++ 中有引入了一種新的符合型別——引用。
引用:引用不是新的變數,只是給已存在的變數起了乙個別名,編譯器並不會為引用變數開闢記憶體空間,它和他引用的變數共用一塊記憶體空間。
void testref()
引用的使用場景:
1、函式形參
void swap(int &a,int &b)
2、返回值
int add(int a,int b)
int &add(int& a,int& b)//返回引用
int &fun()
int main()
可不可以說一下,這兩個分別都是什麼,要是第一次見到,那麼會不自覺的說出兩個2,然並不是,答案是:2,264683952。
這個可是很神奇的現象,我們在認識引用之前都沒有遇到過,第一次輸出的是我們預期的值,然而第二次輸出的是個什麼鬼。這個優勢怎麼回事?
那麼現在,我們就來說一下吧:
這時因為cout也是乙個函式呼叫,所以也會生成棧幀,那麼當add函式結束,棧幀銷毀後,(棧幀銷毀,只是將空間還給作業系統,但是裡面的內容不會變化),第乙個cout函式還可以輸出正確的值,是因為ret所代表的那塊空間的值還不變,呼叫函式先是傳參,所以第一次傳參正確,當第乙個cout函式呼叫結束後,ret那塊空間的值已被覆蓋,所以當呼叫第二個cout函式傳參時,ret那塊空間的值被第乙個cout函式的棧幀覆蓋了,所以第二次傳參時傳的是乙個隨機值,所以第二次輸出的ret就是乙個隨機值。注意:不要返回棧記憶體的引用
引用和指標的區別:
void testrefandpoint()
1、引用在定義時必須初始化,指標沒有要求。
2、一旦乙個引用被初始化為指向乙個物件,就不能再指向其他物件,而指標可以在任何時候指向任何乙個同型別物件
3、沒有null引用,但有null指標。
5、引用自加改變變數的內容,指標自加改變了指標指向
6、有多級指標,但是沒有多級引用
7、引用比指標使用起來相對更安全
指標和引用,const 指標和const 引用
指標和引用是在使用中經常弄混淆的兩個概念。引用 reference 為物件起了另外乙個名字,用符號 表示。name,例如 int i 1024 int ref i 一般在初始化變數時,初始值會被拷貝到新建立的物件中,然而定義引用時,程式把引用和它的初始值繫結 bind 在一起,而不是將初始值拷貝給引...
指標和引用
一 先看一段 include using namespace std void freeptr1 int p1 void freeptr2 int p2 void main 思考 在 freeptr1 和freeptr2 的比較中,你能發現它們的不同點嗎?二 對 進行解釋 include using...
指標和引用
指標與引用看上去完全不同 指標用操作符 和 引用使用操作符 但是它們似乎有相同的功能。指標與引用都是讓你間接引用其他物件。你如何決定在什麼時候使用指標,在什麼時候使用引用呢?首先,要認識到在任何情況下都不能使用指向空值的引用。乙個引用必須總是指向某些物件。因此如果你使用乙個變數並讓它指向乙個物件,但...