C 引用 指標 值

2021-08-20 15:16:17 字數 2394 閱讀 7833

引用概念:

引用不是新定義乙個變數,而是給已存在的變數取乙個別名。編譯器不給引用變數開闢空間。

建立引用變數:

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 把左值當...