引用 變數的別名

2021-06-07 21:06:49 字數 2237 閱讀 2362

1.引用只可以乙個變數所賦值,賦值之後不可以再作為另乙個變數的引用。

舉例:

int a=0;

int b=1;

int &r=a;

r=b;   // error

什麼可以被引用:真值,指標變數。

for instance: 

1. int& r=1;

相當於:

double temp=(double)1;  //其實應該也可以是int型別

int& r=temp;

2. int* iptr;

int* & r=iptr;  

// 表示指標iptr的乙個別名為r

int b=8;

r=&b;     //ok,經過第二部,r已經成為乙個指標,那麼這裡可以被初始化  

什麼不可以被引用:陣列,null。

1. int a[10];

int& r=a;    

// error

2. null

引用本身就不是乙個實體,不佔空間,那麼它就不可以是null

2.引用傳遞引數注意問題:多個函式怎麼匹配

void fn(int a){};

void fn(int& a){};

void main()

3.利用引用「返回」多個值?

實際上:利用引用不是說可以返回多個值,而是把需要改變的值以引用的方式傳遞過去,在函式內部改變它們之後就相當於返回了多個值。

/*程式目的是得到乙個輸入值的平方和立方。

*/#include

using namespace std;

void square_cube(int n,int& square,int& cube);

void main()

// 傳遞square,cube的引用過來,那麼在函式square_cube內部改變他們的值得時候,

實際上是改變了main中的square,cube的值,所以在main中輸出來的的確是n的平方和立方。

4.用引用返回值四種型別。

#include

float temp;        //全域性變數,駐留在記憶體的data區

fn1()返回的時候(返回型別為float),data區域的temp的副本賦值給 stack區的臨時變數,a=fn1()之後臨時變數再賦值給a。

fn1()返回的時候(返回型別為float),data區域的temp的副本賦值給stack區的臨時變數,b=fn1()之後,b作為臨時變數的乙個別名;

危險!因為臨時變數會隨著fn1()的結束而消失,那麼引用b也會變得沒有意義,所以著這種做法不合適。

fn2返回的時候(返回型別為float&),data區域的temp的副本直接越過臨時變數,在c=fn2()之後,直接複製給c。

fn2返回的時候(返回型別為float&),在d=fn2()之後d直接作為temp的乙個別名(而不是向前面那麼作為臨時變數的別名)。

5.利用引用讓函式呼叫作為左值

#include

using namespace std;

int n;

int& num(int& n);

void main()

int& num(int& n)

引用 變數的別名,並非指標

引用是乙個已經存在的物件的別名。一旦乙個物件初始化了這個引用,那麼名稱和引用都能夠用來引用該物件。int a 12 int ra a ra 是物件a 的乙個別名 ra 此時物件 a 11 a 10 ra 10 int pa ra pa 指標指向物件 a引用經常與指標混淆,可能是c 編譯器常常將引用像...

c語言 引用(變數的別名)

int a 10 int b a 引用 必須在定義的時候初始化,無空引用,且引用不分等級。指標 指向具體的記憶體空間,是間接訪問變數,指標自身消耗記憶體空間 其指向 可變的 除非用了const 不一定存在,如空指標null 引用 不用分配記憶體區域 引用 別名而已 的位址其實就是被引用物件的位址 必...

符號引用 typeglob,別名 與全域性變數的修改

不能以為在子函式裡修改了乙個和全域性變數同名的變數就會修改全域性變數 usr bin perl glov hello change print glov sub change 雖然在子程式 change 裡的 glov 變數和全域性變數 glov 名字相同,但兩個並不是同乙個變數,子程式裡的變數為區...