你到底是什麼?

2021-07-03 16:16:58 字數 3129 閱讀 1390

前兩天資料結構課設,老師問了乙個問題,讓我再次清醒了一下,我這麼渣,怎麼當程式設計師。。。

問題:函式宣告中引數用「&」是什麼用法?

我蒙了,我說這個函式是我copy的,我認為用&和用*都可以實現功能。

老師告訴我他只想考我一下基礎知識,這個叫「引用」。//此處前提是我們在討論c語言的程式

我蒙了,引用?找找資料自己腦補吧!

在c語言中,&有三種作用,分別如下:

1. 取位址。單目運算子。用來取乙個變數的位址。

比如

int i, *p;

p = &i;//這裡的&作用是取變數i的位址。

最常用的是scanf()中,
int a;
scanf("%d",&a);//取位址
2. 位操作中的與操作運算子。

也就是常說的and操作,雙目運算子。 

計算的時候按位計算,&兩邊運算元對應位上全為1時,結果的該位值為1。否則該位值為0

比如0x12&0x23 轉為二進位制為:

b00010010&b00100011,

按位計算結果為b00000010,

即結果為0x02。

3. 當兩個&&一起用的時候,表示為邏輯運算中的與運算。

邏輯運算結果只有0和1兩種結果。 

一般在&&兩邊是兩個邏輯表示式。

當兩個表示式值均為1時,&&運算結果為1,否則為0。

比如2>1 && 0<1 這個的值為1&&1 = 1。

1>2 && 2>0 這個值為0&&1 = 0。

1>2 && 2>3 這個值為0&&0=0。

在c++中呢?

除了c中的功能多加了乙個「引用」,這個才是----------引用

有人要問了,我用c語音寫的使用了引用的用法,怎麼也行?

你的編譯器在"搗鬼",c和c++編譯器可能在一起,它能夠允許你使用c++的用法。

(下面這段**h.t.t.p:

一、引用簡介

引用就是某一變數(目標)的乙個別名,對引用的操作與對變數直接操作完全一樣。

引用的宣告方法:型別識別符號 &引用名=目標變數名;

【例1】:int a; int &ra=a; //定義引用ra,它是變數a的引用,即別名

說明:(1)&在此不是求位址運算,而是起標識作用。

(2)型別識別符號是指目標變數的型別。

(3)宣告引用時,必須同時對其進行初始化。

(4)引用宣告完畢後,相當於目標變數名有兩個名稱,即該目標原名稱和引用名,且不能再把該引用名作為其他變數名的別名。

ra=1; 等價於 a=1;

(5)宣告乙個引用,不是新定義了乙個變數,它只表示該引用名是目標變數名的乙個別名,它本身不是一種資料型別,因此引用本身不佔儲存單元,系統也不給引用分配儲存單元。故:對引用求位址,就是對目標變數求位址。&ra與&a相等。

(6)不能建立陣列的引用。因為陣列是乙個由若干個元素所組成的集合,所以無法建立乙個陣列的別名。

二、引用應用

1、引用作為引數

引用的乙個重要作用就是作為函式的引數。以前的c語言中函式引數傳遞是值傳遞,如果有大塊資料作為引數傳遞的時候,採用的方案往往是指標,因為 這樣可以避免將整塊資料全部壓棧,可以提高程式的效率。但是現在(c++中)又增加了一種同樣有效率的選擇(在某些特殊情況下又是必須的選擇),就是引 用。

【例2】:

void swap(int &p1, int &p2) //此處函式的形參p1, p2都是引用

為在程式中呼叫該函式,則相應的主調函式的呼叫點處,直接以變數作為實參進行呼叫即可,而不需要實參變數有任何的特殊要求。如:對應上面定義的swap函式,相應的主調函式可寫為:

main( )

說明:(1)以引用返回函式值,定義函式時需要在函式名前加&

(2)用引用返回乙個函式值的最大好處是,在記憶體中不產生被返回值的副本。

【例5】以下程式中定義了乙個普通的函式fn1(它用返回值的方法返回函式值),另外乙個函式fn2,它以引用的方法返回函式值。

#include

float temp; //定義全域性變數temp

float fn1(float r); //宣告函式fn1

float &fn2(float r); //宣告函式fn2

float fn1(float r) //定義函式fn1,它以返回值的方法返回函式值

float &fn2(float r) //定義函式fn2,它以引用方式返回函式值

void main() //主函式

}(5)在另外的一些操作符中,卻千萬不能返回引用:+-*/ 四則運算符。它們不能返回引用,effective c++[1]的item23詳細的討論了這個問題。主要原因是這四個操作符沒有side effect,因此,它們必須構造乙個物件作為返回值,可選的方案包括:返回乙個物件、返回乙個區域性變數的引用,返回乙個new分配的物件的引用、返回一 個靜態物件引用。根據前面提到的引用作為返回值的三個規則,第2、3兩個方案都被否決了。靜態物件的引用又因為((a+b) == (c+d))會永遠為true而導致錯誤。所以可選的只剩下返回乙個物件了。

4、引用和多型

引用是除指標外另乙個可以產生多型效果的手段。這意味著,乙個基類的引用可以指向它的派生類例項。

【例7】:

class  a;

class  b:public a;

b  b;

a  &ref = b; // 用派生類物件初始化基類物件的引用

ref 只能用來訪問派生類物件中從基類繼承下來的成員,是基類引用指向派生類。如果a類中定義有虛函式,並且在b類中重寫了這個虛函式,就可以通過ref產生多型效果。

三、引用總結

(1)在引用的使用中,單純給某個變數取個別名是毫無意義的,引用的目的主要用於在函式引數傳遞中,解決大塊資料或物件的傳遞效率和空間不如意的問題。

(2)用引用傳遞函式的引數,能保證引數傳遞中不產生副本,提高傳遞的效率,且通過const的使用,保證了引用傳遞的安全性。

(3)引用與指標的區別是,指標通過某個指標變數指向乙個物件後,對它所指向的變數間接操作。程式中使用指標,程式的可讀性差;而引用本身就是目標變數的別名,對引用的操作就是對目標變數的操作。

(4)使用引用的時機。流操作符《和》、賦值操作符=的返回值、拷貝建構函式的引數、賦值操作符=的引數、其它情況都推薦使用引用。

敏捷到底是什麼?

文 ivar jacobson 在支援軟體工程 比如rational統一過程rup 與敏捷陣營 比如scrum或是xp 之間,人們一直存在著衝突。也不難理解,因為這兩種方法間都是在用著彼此並不相容的方式來描述的。其實大可不必,因為他們背後的觀點全然是相輔相成的。關鍵在於該如何用對兩者來說都公平的方式...

我們到底是什麼?

我們到底是什麼?我們是一種生物電流 生物電流有幾種狀態,喜怒哀樂等,可以根據外部環境進行自我切換 該種生物電流附屬在一種器官硬體上面 我們可以從器官硬體上感知一些資訊,產生新的資訊生物電流,新產生的生物電流符合原先的標準 我們可以把資訊電流儲存在器官硬體上,但具體如何儲存等資訊無法被我們感知 我們的...

SDN到底是什麼

sdn到底是什麼?雖然這個概念已經被炒到了,但還沒有人對其給出乙個明確的概念。盛科網路總監張衛峰撰寫了自己關注sdn以來,對其認識的四個階段,最後乙個階段又回到了sdn字面的意思軟體定義網路,每個階段作者的新觀點,也會給我們帶來一些啟發。以下為原文 我對sdn的認識可以分為四個階段,最後乙個階段是在...