函數調用中參數傳遞的問題

來源:互聯網
上載者:User

悶在家裡,無聊啊~~~~~

看資料結構C++描述的,清華的黃皮書,書有夠爛。講的索然無味,而且書中錯誤N多~~汗!

裡面有個結構都是用template寫的,說到最小堆的時候,有個函數重載,
const MinHeap <Type> & operator = (const MinHeap &R); 說是堆複製賦值

然後它的建構函式就開始扯了:
template <class Type> MinHeap<Type>::MinHeap(Type arr[],int n)
{
 MaxHeapSize=Default <n?:n:DefaultSize;
 heap = new Type [MaxHeapSize];
 heap = arr;  //這句注釋成複製堆數組
 ............
}

愣是讓我半天沒憋出來,後來才想起來有個運算子多載,暈,可是這 arr 好像是指標吧,能這樣啊~~
再說了,返回的還是const呢~~暈

不用說了,自己改吧,由於重載的是指標 所以寫成:
Type * operator = (const Type * R)

本想保留返回一個&的,怎麼也想不同。以前對函數傳遞的理解是認為 如果是傳值,就是先產生一個臨時變數,然後在把臨時變數賦值給行參,指標的話就是傳遞地址,變數名其實是地址的別名,不佔用記憶體,指標傳遞的時候也會產生臨時變數,只不過只是4個位元組罷了。

今天用了個小程式反組譯碼了下:

void fun(int a)

{
a=3;
}

int main()
{
 int b=3;
 fun(b);
 return 0;
}

VC6.0下調試,結果傳遞的時候如下:

首先 是mov ax,[ebp-4]

然後直接就push ax了,暈,傳遞完畢,嘿嘿,原來這就是所謂的臨時變數啊~~~

在子函數立裡面使用的時候,修改的實際上是堆棧裡的值,直接改拉,函數返回,堆棧就自動釋放了,難怪不能儲存

在用指標傳的時候 :
lea ax,[ebp-4]
push ax
看見差別了吧,用lea取得b的地址,壓入堆棧,以後操作當然是直接修改了,暈,這也行,經實驗 引用的傳遞方式和指標完全一樣,程式不知道怎麼知道這是引用的哈,看來得學學編譯原理了。:)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.