引用概念:
引用不是新定義乙個變數,而是給已存在的變數取乙個別名。編譯器不給引用變數開闢空間。
建立引用變數:
c++給&符號賦予了乙個新的含義,用來宣告引用,如下:
int a = 10;
int& ra = a;//ra為a的引用
此處ra與a的值和位址都相同,其實就是同一記憶體空間的取得兩個名字
注意:
int b = 20;
ra = b;//此處並不是將ra作為b的引用,而是賦值語句。將b的值賦給a。
int& rra = a;//rra也為a的引用
引用與指標的區別?1.如果將引用寫成指標形式,應該怎麼寫?
int& ra = a;
int *const p = &a;
2.引用與指標都可以做函式引數,但引用使用起來更方便。
void swap(int
*a,int
*b)void swap(int &a,int &b)
之前,我們說編譯器不會給引用變數開闢空間,那麼這裡swap(int&,int&)c引數是直接使用實參的嗎?其實並不是,編譯器在處理引用形參時,其實是將引用變數處理成指標。如圖:
因此傳址、傳引用效率是相同的
3.引用與指標的+、-操作
int a = 10;
int ra =a;
int *pa = a;
ra++;//a++;
4.引用在定義時必須初始化,指標不要求
int &ra;//不允許
5.沒有空引用,有空指標
6.sizeof含義不同,引用結果為引用型別大小,指標始終為4(32位)/8(64位)
7.指標有多級指標,引用沒有多級引用
//存在
int **ppa;
//不存在
int &&ra;
傳引用、傳值
double square1(double a)
double square2(double&ra)
在square1中,可以使用多種引數。例如,如下
double b = square1(a+10.0);
double c = square1(10.0);
但這兩種呼叫方式在square2中都是不可使用的。那什麼情況下就可以使用了呢?在square2中使用const:
double square2(const
double &ra)//常引用
此時,如果實參與引用引數不匹配,c++將有可能生成臨時變數。那什麼時候會生成臨時變數?
什麼是左值?左值是可以被引用的物件,例如,變數、陣列成員、結構體、引用都是左值。非左值包括字面常量(用引號括起來的字串除外,它們由其位址表示)和包含多項式的表示式。在c語言中,左值最初指的是可以出現在賦值語句左邊的實體,但是c++中引入了const關鍵字之後,常規變數和const都可視為左值,因為都可通過位址訪問它們。但常規變數屬於可修改左值,const屬於不可修改左值。
square2(a+10.0)、square(10.0)資料型別正確,但不是左值。
這時編譯器就會產生匿名的臨時變數,並讓ra指向它。
int a = 10;
square2(a);//實參的型別不正確,但可以轉化為正確的型別
注意:這些臨時變數只在函式呼叫期間存在,此後編譯器可以隨意將其
刪除那為什麼一定要常量引用才可行呢?
看**:
void swap(int &ra,int &rb)
long a = 10,b = 20;
swap(a,b);
由於「實參的型別不正確,但可以轉化為正確的型別」,所以編譯器建立兩個臨時變數,分別用ra、rb指向它們,swap函式實際交換了臨時變數的值,與實際意圖不符。所以只有在函式的目的是使用引用變數而不是修改引用變數時,臨時變數才不會造成什麼不利影響。 c 值傳遞 指標傳遞 引用傳遞
值傳遞 形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的 實參 形參 引數的值只能傳入,不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。指標傳遞 形參為指向實參位址的指標,當對形參的指向操作時,就相當於對實參本身進行的操作 引...
c 值傳遞,指標,引用使用總結
溫故而知新,每次重溫一遍知識點,都有新的見解。參考 首先需要了解程式的記憶體是如何分配的 c c 程式記憶體的各種變數儲存區域和各個區域詳解 棧區 stack 由編譯器自動分配與釋放,存放為執行時函式分配的區域性變數 函式引數 返回資料 返回位址等。其操作類似於資料結構中的棧。堆區 heap 一般由...
C 引用(左值引用,右值引用)
特點 引用 引用本質指標實現。引用一旦初始化,不會引用其他變數。右值引用目的 快速建立暫存器資料的引用,就是還沒有記憶體實體的資料可以立即建立乙個引用。一般寫模板函式有乙個左值引用的模板函式,都會對應乙個右值引用的模板函式,即使實現 是相同的。左值 有記憶體實體 右值 暫存器的值 move 把左值當...