C 函式返回引用問題,c 函式返回引用問題

2022-02-25 03:11:01 字數 5767 閱讀 9264

1樓:匿名使用者

#include

using namespace std;

int a=;

int &index(int i);//這裡需要申明一下 否則main不能呼叫index函式

int main()

{index(2)=25;

cout<

返回引用:

1)主函式main的返回值:這裡提及一點,返回0表示程式執行成功。

2)返回非引用型別:函式的返回值用於初始化在跳用函式出建立的臨時物件。用函式返回值初始化臨時物件與用實參初始化形參的方法是一樣 的。

如果返回型別不是引用,在呼叫函式的地方會將函式返回值複製給臨時物件。且其返回值既可以是區域性物件,也可以是求解表示式的結果。

3)返回引用:當函式返回引用型別時,沒有複製返回值。相反,返回的是物件本身。

2樓:

在main中開頭加一句int &index(int);,或者把函式index的定義提前到main前面就行了……c/c++規定所有變數和函式必須先宣告後引用,前述兩種方法都是在進行函式index的宣告,而寫在main後面的函式被認為是沒有宣告過的,所以你編譯不過。「引用」是c++的一種型別,它是某個變數的別名,比如int a,&p=a;這就是給a又起了個名字叫p,使用p和使用p就是一樣的了。c++為「引用「賦於了新的內涵:

當函式的形式引數使用「引用型別」時,函式內對「引用」的操作可以改變原變數的值,而用變數型別作形式引數時是拷貝傳值,沒有這種優勢。返回」引用「的函式在函式名前加一個&,再前面是型別名,比如int &index()是返回一個int型「引用」,因為「引用」是int型某變數的別名,所以返回值可以直接賦給int型變數。

3樓:匿名使用者

int &index(int i)

bug bug bug

不能返回臨時變數的引用

c++ 函式返回引用問題

4樓:匿名使用者

指的是你返回一個指向區域性變數的引用,包括引數。

b是int型別,auto在c++中是一個廢棄的關鍵字,不過在c++11中被重新啟用,用來自動推導型別。e是一個引用型別,即可以想象成就是被引用的物件,所以當你取e的地址時,其實獲得的是被引用的物件地址。由於你的e引用的是一個區域性變數,也就是棧上的變數,因為棧的起始地址一般都會隨機變化,所以你會得到不一樣的結果。

隨機變化的原因是為了防止某些型別的攻擊,提高程式安全性。

c++中不存在static型別一說,static是用來指示變數的生命週期型別,即靜態生命週期。我想你是想說b是static int。當為static int時,程式啟動時就會將b初始化為40,此時一直持續到程式結束,所以此時返回引用是合法,因為編譯器保證,該變數生命週期會持續整個程式執行期間。

e2 = f();

這裡返回引用,而e2不是引用,所以會進行拷貝初始化,所以e2和f()返回的引用是兩個物件。e2為40。

f()=10;

這裡由於返回引用,而引用指向static int b,所以會對b進行修改,於是b變為10。

e2是main的區域性變數,e是引用,f()返回值是引用,此時e等價於f()。當取地址時,e2的地址將不會等於e的地址,因為他們是兩個物件,兩個物件的地址必然不同(除了一個類的子物件)。這裡e2是區域性變數,所以分配在棧上,而e,f()指向的是靜態變數,所以分配在全域性記憶體中。

5樓:潘家大少

引用是繫結記憶體,意思是一個引用會鎖定程式的地址空間中某一地址,地址是常量,只有該地址對應的記憶體單元的內容可以變化

這個問題上,先說明一個原則:函式不要返回一個臨時變數的引用。因為臨時變數在棧區,函式結束時它的地址空間要**再用,所以接下來這個地址的內容變成不可控。

對於auto b的情況,就觸犯了這個原則,沒有研究的意義。至於為什麼單步執行和一次執行結果不一樣,可能是vc在不同的除錯模式下對地址空間的使用不一樣吧。

b為static的時候,b處於程式的資料段,不在是棧區,因為b不是臨時變數了,所以對b進行賦值後,它的狀態會保留至函式結束。

f()=10是賦值,b是auto時,賦值給棧記憶體;b是static時,賦值給資料段記憶體。

6樓:匿名使用者

首先,永遠不要返回區域性變數的引用。因為區域性變數在函式返回時被**,即這個變數不存在了,所以以後對這個變數的引用都是無意義的,結果是不可預知的,程式很可能會崩潰。因此,也就不解釋這種情形的結果了。

由於靜態變數的宣告週期直到程式結束,所以返回靜態變數的引用是有意義的,而且安全的。下面解釋返回靜態變數的引用的情形:

#include

using namespace std;

int& f()

int main()

c++中返回引用和返回值的區別

7樓:

通常的返回機制將返回值複製到臨時儲存區域中, 隨後呼叫程式將訪問該區域.

返回引用則程式則呼叫程式將直接訪問返回值.

通常引用將指向傳遞給函式的引用, 因此呼叫函式實際上是直接訪問自己的一個變數.

比如const int& fun (int& a, const int& b)

int x = 1, y = 2, z;

z = fun(x, y);

//等價於 fun(x, y); z = x;

而且返回引用不能返回函式內部的臨時變數, 因為該變數隨著函式的結束而銷燬, 返回值會毫無意義, 如

const int& fun (int& a, const int& b)

//該程式會崩潰, 因為變數c隨著程式的結束而銷燬, 繼而返回的c的同名物件毫無意義

8樓:嚴棠偉雨筠

如果返回值,那麼記憶體中只有兩個儲存該整形資料的單元,一個是函式中生成的被返回的整形資料,一個是接收以後的整形資料,而返回引用則只要一格單元來儲存這個整形資料,被返回的和接收到的都是同一個整形資料。

c++ 引用返回值 與 返回指標

9樓:匿名使用者

int * d = &c;

也就是*d就等效於c了啊

也就是return *d;

就等效於

return c;

10樓:匿名使用者

*d是指標d指向的資料,你的寫法中,指標d指向了引用c的位置,其實也就是傳入實參a的地址空間上的資料,故而是一直存在且可以正確返回的。如果你在k()函式內部不是使用傳輸的c(也就是換個變數名,什麼都行),那自然就不可以了,出了這個函式就被釋放了

11樓:匿名使用者

return *d;你返回的是指標d指向的值,並不是返回的指標...return d;才是返回的指標 int*...而你h函式返回值型別是int& 也相當於int 這時候編譯的話c++應該會報錯,因為c++編譯器檢查型別很嚴格 c編譯器裡面雖然沒有引用,int* 返回成int 可能會報警告,因為指標儲存的地址也是一個數..

有的會報錯...

區域性變數是不能返回成引用的...引用的實質相當於給變數弄了個別名,然後通過別名去找這個變數...而區域性變數的記憶體空間在函式結束後就被**了,也就是這個變數不存在了,那麼它的別名還有什麼意義....

c++函式返回值為引用型別時出錯!大神進!

12樓:匿名使用者

我不是大神,但我大概知道你是怎麼回事。

你的引數是const string&型別,首先你要知道string&前為什麼要加const. 還有你要知道const物件和非const物件的區別在**。

物件前加const, 則只能呼叫該物件的const方法,換句話說,不能對其進行任何內容上的修改。而傳&是因為要避免複製構造,所以引數為const string&.

那麼再來說說你的函式體內的這行**,首先word+ending將產生一個臨時物件,因為呼叫了string內部的string operator(const string& lhs, const string& rhs)函式。基於此,你的函式就不能返回引用。因為函式體內的臨時物件在函式出棧之後會被銷燬。

所以除非你取消+號,只返回某個引數。不然就不能返回引用!

接下來說說你的const問題。因為你的引數是const的,但是你返回的時候卻把const給取消了,返回了string&. 這是絕對不允許的。

你可以想象,const物件是對普通物件的一種限制,那麼由普通物件變成const物件,這種是允許的,因為限制沒有被放大。但是反過來,由一個const物件變成普通物件,你試圖放大這種限制就不被允許了。除非你使用c++提供的const_cast轉換!

13樓:匿名使用者

const string 不能繫結為string 引用,編譯器已經說的很明白了

c++ 函式返回引用

14樓:頓建設容鸞

1.指的是你返回一個指向區域性變數的引用,包括引數。

2.b是int型別,auto在c++中是一個廢棄的關鍵字,不過在c++11中被重新啟用,用來自動推導型別。e是一個引用型別,即可以想象成就是被引用的物件,所以當你取e的地址時,其實獲得的是被引用的物件地址。

由於你的e引用的是一個區域性變數,也就是棧上的變數,因為棧的起始地址一般都會隨機變化,所以你會得到不一樣的結果。隨機變化的原因是為了防止某些型別的攻擊,提高程式安全性。

3.c++中不存在static型別一說,static是用來指示變數的生命週期型別,即靜態生命週期。我想你是想說b是static

int。當為static

int時,程式啟動時就會將b初始化為40,此時一直持續到程式結束,所以此時返回引用是合法,因為編譯器保證,該變數生命週期會持續整個程式執行期間。

e2 = f();這裡返回引用,而e2不是引用,所以會進行拷貝初始化,所以e2和f()返回的引用是兩個物件。e2為40。

f()=10;這裡由於返回引用,而引用指向static

intb,所以會對b進行修改,於是b變為10。

e2是main的區域性變數,e是引用,f()返回值是引用,此時e等價於f()。當取地址時,e2的地址將不會等於e的地址,因為他們是兩個物件,兩個物件的地址必然不同(除了一個類的子物件)。這裡e2是區域性變數,所以分配在棧上,而e,f()指向的是靜態變數,所以分配在全域性記憶體中。

15樓:輝秀英狄亥

1+2是啊,你說的「鏈式應用」我覺得有些誇張就是連續運用操作符號,比如你用加法操作符return一個類型別資料,但是你用想使用這個被加後產生的類的成員x,如果你不引用就是a=b+c;a.x,但是如果你引用了就可以(b+c).x,只是因為如果你只是返還一個值,那麼它只會在棧區開闢一塊資料地址存放零時物件的值,然後把這個臨時物件的值用複製建構函式複製給b,但是你卻不能用它,但是引用是傳地址所以可以用它,有個例子很鮮明能淺顯說明這種區別:

a=3,如果我用3+1,這裡的3就值傳遞情況下的b+c顯然是沒有意義;但是我用a+1就是用意義的,a就是3這個地址的引用,你改變它下面的值是用意義的,只能說這麼多,有些東西還要自己想;

3,更簡單,++a,如果你引用了就是返回了a的地址,此時a已經加1,完全可以,但是如果是a++,你返還的是a加1之前的數值,換句話說此時a已經不是a,而是a+1,但是你如果引用,那麼又是它的地址,而地址下是a+1,那麼後++就和前++沒有任何區別,這樣做是沒有意義的,能明白嗎?

4,你去了當然有用,看你怎麼用了,引用不是強迫你用,但是要看你想實現什麼功能,舉++的例子,你定義函式時必定起傳地址,但是如果你返還不傳引用而是傳值,那麼你想(++a)++,有意義嗎?很顯然沒,應為括號裡的++a是常量,這就和3+1一樣;

5,看了上面的東西,如果你理解了,這個問題就不是問題了,還是地址的問題

C 函式返回型別是引用的問題,C 函式返回值為引用型別時出錯!大神進!

引用就是變數的別名,返回c3的引用,返回的就是c3 c3被清除,再呼叫c3的函式,結果當然不正確 如果返回 i 後,i被清除,但是返回值已經被輸出了,結果是正確的 返回c型別,g函式返回 的是c型別的一個物件,雖然c3被清除,但是返回的物件還能呼叫get函式 你可以在c類中增加一個解構函式,除錯執行...

c語言函式返回值,c語言的函式返回值?

這個跟庫函式的定義有關。還有就是編譯器的差異。有些編譯器預設是非0為真,有些非 1為真。建議不要使用這麼簡單粗暴的辦法判斷。請使用c提供的標準巨集判斷。在 學的。呃。自己寫 寫多了自然就知道了 根據你的程式來看應該是一個void型,不過你這是一個交換資料函式,如果這樣傳進來,是修改不了原址的 而如果...

糾錯 c語言 函式返回指標問題

解釋如下 因為q宣告的是一個區域性變數,所以在函式呼叫結束後它所開闢的記憶體空間就會被系統收回 它裡面的內容也就銷燬了,因此它輸出的是一段亂碼!改下程式 include include include char t char copy char p,int m void main 輸出的是什麼?一起...