資料結構演算法經常看到的形如"stack &S"和"stack S等中的有&和

來源:互聯網
上載者:User

   本文由江偉原創,如要轉載請註明出處,謝謝!

  

  在很多演算法中我們經常看到形如"int InitStack(Stack &S)"和"int Empty(Stack S)"的兩種形式,即有"&"和沒有"&"兩種。相信很多人還沒弄清楚這是怎麼回事。其實這是函數傳參的兩種形式—按值傳遞和按址傳遞。

  

  我們都知道以前學c++時一個經典例子用來解釋這兩種傳參方式的區別,就是調換兩個變數a和b的值的swap函數。當函數是"swap(a,b)"時,調用該函數後,函數操作的其實只是a和b的副本(按值傳遞會先建立參數的拷貝),a和b的值其實並沒變,當用swap(&a,&b)時,因為調用該函數時操作的是地所指的那塊記憶體地區,函數調用結束後a和b當然也變了。同理,"int InitStack(Stack &S)"是初始化棧,S被改變了,要返回到主函數中,所以要用按址傳遞;而"int Empty(Stack S)"只是判斷S是否為空白,並沒改變S的內容,所以不用按址傳遞。


  因此,在資料結構的那些函數中有的有"&",有的沒"&",也就不奇怪了。

  還有,有的函數傳遞參數可以按值傳遞,但是由於要先建立參數的拷貝,這樣會耗費時間和空間等資源,所以用按址傳遞更好。除了用取地址符&,也可以用指標的方式也就是"int InitStack(Stack *S)"。


  最後,比如初始化棧這個函數如果不用"InitStack(Stack &S)",而用"InitStack(Stack S)"也行,只不過函數體最後要加上"return S;",並且將函數傳回值類型改為"Stack",即"Stack InitStack(Stack S)",但是如果遇到"int Pop(Stack &S,SElemType &e)"這樣要返回兩個值的,不好用這種方法了。而且感覺這樣有點多此一舉。。。。。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.