函式的返回值為指標型別的時候

2021-08-06 01:20:47 字數 2932 閱讀 3623

非常量引用的初始值必須為左值

一。 c++例項

*****

*****

*****

*****

*****

*****

*****

*****

*****

***b show()

*****

*****

*****

*****

*****

*****

*****

*****

*****

****

void test()

*****

*****

*****

*****

*****

*****

*****

*****

*****

****

以c++

的某個自定義類為例:

當show返回值是自定義型別後,呼叫該函式,會自動呼叫一次拷貝建構函式生成乙個臨時變數,即返回值

是乙個臨時變數

二。 c例項

*****

*****

*****

*****

*****

*****

*****

*****

*****

****

typedef struct big_thing

big_thing;

*****

*****

*****

*****

*****

*****

*****

*****

*****

****

big_thing return_test()

int main()

*****

*****

*****

*****

*****

*****

*****

*****

*****

****

出自《程式設計師的自我修養-鏈結、裝載與庫》p299

eax是函式傳遞返回值的乙個通道。

1.對於小於4個位元組的資料函式將返回值儲存在eax中。

2.5~8個位元組物件的情況呼叫慣例都是採用eax和edx的聯合返回方式進行。

3.大於8個位元組的返回型別,用上面**測試:

以c語言的一段**為例:

1.首先main函式在棧額外開闢了一片空間,並將這塊空間的一部分作為傳遞返回值的臨時物件,這裡稱為temp

2.將temp物件的位址作為隱藏引數傳遞個return_test函式

3.return_test 函式將資料拷貝給temp物件,並將temp物件的位址用eax傳出。

4.return_test返回以後,mian函式將eax 指向的temp物件的內容拷貝給n。

簡單就是一句話:當返回值非引用的時候,只要有函式返回值,那麼該返回值就是乙個臨時變數
三:臨時變數能不能被引用:

class a;

a func();

const a &ref=func();

這種情況下,ref 會一直有效到ref消失

函式是值返回,建立了乙個臨時變數

a &ref=func();

若沒有加const,該引用也不能成立

解釋: : 臨時的中間變數都是const,所有沒有const的引用會失敗。

四: 最後說一下我出現的問題:

*****

*****

*****

*****

*****

*****

*****

*****

*****

****

const node* getroot()

*****

*****

*****

*****

*****

*****

*****

*****

*****

****

沒問題:

void test(binarytree t1, binarytree t2)

*****

*****

*****

*****

*****

*****

*****

*****

*****

****

有問題:

void test(binarytree t1, binarytree t2)

非常量引用的初始值必須為左值:

左值,右值:

左值和右值都是針對表示式而言的,左值是指表示式結束後依然存在的持久物件,右值是指表示式結束時就不再存
解釋:

兩個對比一下,你會發現,有問題的僅僅少了個const

1. 聯想前面的例子:返回乙個普通變數和返回乙個指標變數,都是對這個變數的乙份臨時拷貝進行返回。

2. 函式的返回值雖然是乙個指標,但是返回的這個指標本身就是乙個原指

針的乙份拷貝,是乙個臨時變數,具有常屬性

3. 當你寫乙個函式返回值為任意型別的指標的時候,取函式的返回值位址(不能先定義變數 = 函式

,再給變數取位址,應該直接對所呼叫的函式取位址),你會發現,取位址錯誤,也是因為臨時變數。

4.返回型別是內建型別的時候,函式不能直接取位址,而若是自定義型別的話,函式就可以直接取位址,與編譯器處理有關

參考文章:

函式返回值為指標型別

char getstring void void main void 在函式getstring 中定義的變數p屬於local 區域性變數 當函式結束時自動消失,所以在返回時,根本就得不到p所指的內容。解決辦法有以下幾種 可能還有很多方法,不過這裡只是最常見的幾中,也是最能體表現程式中記憶體使用的情況...

函式返回值為指標型別的總結

參考部落格 char getstring void void main void void main 3 可以定義為靜態型別,static char p hello world 用static 宣告乙個指標可以,但也不太好,因為如果你多次呼叫這個函式返回多個指標,但這幾個指標實際上指向同一塊位址,改...

返回值為函式指標的示例

include include double getmin double dbdata,int isize 求最小值 return dbmin double getmax double dbdata,int isize 求最大值 double dbmax int i assert isize 0 d...