C++學習筆記(二)——交換函數(swap)

這次我們要透過一個簡單的函數swap深入理解函數傳參的本質以及在C++中如何選擇傳參方式。

先來看第一段程序:

void swap(int x, int y) {int temp = y;y = x;x = temp;
}

通過main函數的調用,我們發現x,y并未實現交換:

int main()
{int x = 1;int y = 37;swap(x, y);cout << x << ":" << y << endl;return 0;
}

原因是整形x和y在函數swap內為按值傳遞,按值傳遞時,函數不會訪問當前調用的實參。函數處理的值是它本地的拷貝,這些拷貝被存儲在運行棧中,因此改變這些值不會影響實參的值。一旦函數結束了,函數的活動記錄將從棧中彈出,這些局部值也就消失了。

在按值傳遞的情況下,實參的內容沒有被改變。這意味著程序員在函數調用時無需保存和恢復實參的值。如果沒有按值傳遞機制,那么每個沒有被聲明為const 的參數就可能會隨每次函數調用而被改變。按值傳遞的危害最小,需要用戶做的工作也最少。毫無疑問,按值傳遞是參數傳遞合理的缺省機制。

另外,如果作為實參的變量是一個大型類的對象,分配并拷貝到棧中的時間和空間開銷往往過大。

要實現swap函數的效果,我們應如何處理呢?第一個可行的做法是將形參聲明成指針:

void pswap(int *x, int *y) {int temp = *y;*y = *x;*x = temp;
}

?

在pswap函數中,由于傳遞的是兩個變量的內存地址(指針)使得我們可以直接操作對應的值。實際上這里還是存在按值傳遞的問題,只是由原先的整形傳遞變成了指針傳遞。我們可以修改指針指向的內存卻依然無法修改指針本身。第二個可行的做法是想形參聲明為指針的引用:

void prswap(int *&x, int *&y) {int temp = *y;*y = *x;*x = temp;
}void prswap(int *&x, int *&y) {int *temp = y;y = x;x = temp;
}

?

請注意,同一個函數原型下我提供了兩種函數定義。可無論哪一種,在實參傳遞的階段都不會發生按值傳遞的問題。那么兩種定義到底哪一種更滿足我們需求:

(1)交換內存中的值

(2)交換指針地址

如果單獨考慮本文的需求,第一種方法更滿足。但是,如果我們需要交換的是一個大型類對象,第二種的效率則更高。

總結:內存管理是C++學習的一個難點,初學者往往不容易掌握。但越是如此就越能體現一個開發者的語言內功。

轉載于:https://www.cnblogs.com/learnhow/p/8543822.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281024.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281024.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281024.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大數據背后是個萬億市場

2014年的GDP中消費占比已經超過了50%&#xff0c;標志著中國經濟正在向市場經濟轉型&#xff0c;消費占GDP50%&#xff0d;70%是中等發達國家向市場經濟過渡的一個表現&#xff0c;未來中國經濟增長最大的引擎應該來源于消費&#xff0c;特別是個人消費。中國正在經歷經濟結構調…

ipad iphone開發_如何將iPhone或iPad置于恢復模式

ipad iphone開發If your iDevice starts acting strangely and you’ve run through the gamut of normal troubleshooting fixes, Recovery Mode may be your answer. This lets you easily reset the device and re-install iOS using iTunes. 如果您的iDevice開始運行異常&a…

從三層架構說起,談談對歷史項目的小改造

web development項目背景說明最近接手一個 “老” 項目的需求修改&#xff0c;項目整體基于 .net core 3.1 平臺&#xff0c;以傳統的三層架構為基礎構建。了解需求后&#xff0c;逐步對原有項目框架進行大概的了解&#xff0c;主要是熟悉一些框架的開發規范&#xff0c;基本工…

C# message簡單實現窗口間信息接收與發送

剛接觸windows 不同程序 窗口消息傳遞&#xff0c;不理解IntPtr SendMessage(int hWnd, int msg, IntPtr wParam, IntPtr lParam)這函數怎么用&#xff1f;消息內容怎么傳遞過去&#xff0c;還遇到需要message結構體&#xff1f;IntPtr怎么用呢&#xff1f; 但實際只是用來傳個…

在Kubernetes集群上部署和管理JFrog Artifactory

JFrog Artifactory是一個artifacts倉庫管理平臺&#xff0c;它支持所有的主流打包格式、構建工具和持續集成&#xff08;CI&#xff09;服務器。它將所有二進制內容保存在一個單一位置并提供一個接口&#xff0c;這使得用戶在整個應用程序開發和交付過程中&#xff0c;能更易于…

已知思科ASA設備漏洞仍在其新版本中存在

近日&#xff0c;名為“Shadow Brokers(影子經紀人)”的黑客組織聲稱成功入侵了跟NSA相關的Equation Group(方程式組織)的計算機系統&#xff0c;并成功竊取到了大量的機密信息以及黑客工具。隨后&#xff0c;“Shadow Brokers”黑客組織將60%的泄漏文件在網上進行了公布&#…

Yii Listview

轉載于:https://www.cnblogs.com/xiong63/p/8546376.html

Git 操作筆記/pip換源

pip換源 阿里云的源,在cmd命令行中輸入上述命令即可 pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ 還原commit 不可逆 1.git log2.選擇某次提交的commit ID3.使用git reset --hard commit ID 遠程查看與斷開 git remote -vgit remote rem…

.NET 7 的 AOT 到底能不能杠反編譯?

一&#xff1a;背景 1.講故事在B站&#xff0c;公眾號上發了一篇 AOT 的文章后&#xff0c;沒想到反響還是挺大的&#xff0c;都稱贊這個東西能抗反編譯&#xff0c;可以讓破解難度極大提高&#xff0c;可能有很多朋友對逆向不了解&#xff0c;以為用 ILSpy,Reflector,DnSpy 這…

google hdr+_更好的隱私權控制使Google+死了

google hdrEarlier this year, Google started a project to review third-party developer access to Google accounts through the use of APIs. It found a security breach surrounding Google, and is now shutting the service down, at least for consumers. 今年年初&a…

新0-Day漏洞或將給Linux桌面發行版帶來浩劫

Linux 的各個發行版都一直強調安全及其相關元素&#xff0c;比如防火墻、滲透測試、沙盒、無痕上網和隱私等等&#xff0c;但事實上可能并沒有想象中的那么安全。安全研究員 Chris Evans 公開了其發現的針對 Linux 桌面發行版的 0day 漏洞&#xff0c;利用特制的音頻文件入侵 L…

php中把美國時間轉為北京時間的自定義

我的服務器北京時間&#xff0c;php調用的時間&#xff1a; date.timezone "America/Chicago" 這是美國這邊的一個時間&#xff0c;有的時候跟北京相差13個小時&#xff0c;有的時候跟北京時間相差14個小時&#xff0c;所以很不好處理&#xff0c;現在php函數就能處…

C# DataTable筆記

文章轉載自http://www.cnblogs.com/Sandon/p/5175829.html 感謝博主Sandon。 為了方便以后編程查看&#xff0c;特把文章復制過來。 創建表 //創建一個空表 DataTable dt new DataTable(); //創建一個名為"Table_New"的空表 DataTable dt new DataTable("Tabl…

一份詳盡的利用 Kubeadm部署 Kubernetes 1.13.1 集群指北

2019獨角獸企業重金招聘Python工程師標準>>> 概 述 Kubernetes集群的搭建方法其實有多種&#xff0c;比如我在之前的文章《利用K8S技術棧打造個人私有云&#xff08;連載之&#xff1a;K8S集群搭建&#xff09;》中使用的就是二進制的安裝方法。雖然這種方法有利于我…

.NET性能優化-使用內存+磁盤混合緩存

我們回顧一下上一篇文章中的內容&#xff0c;有一個朋友問我這樣一個問題&#xff1a;我的業務依賴一些數據&#xff0c;因為數據庫訪問慢&#xff0c;我把它放在 Redis 里面&#xff0c;不過還是太慢了&#xff0c;有什么其它的方案嗎&#xff1f;其實這個問題比較簡單的是吧&…

最小生成樹詳解

注&#xff1a;本文算法使用鏈式前向星數據結構實現。學習鏈接&#xff1a;鏈式前向星-學習筆記 一、Prim算法 普通prim算法模板&#xff1a; //用前向星錄數據的時候記得把head初始化為-1 fill(dist,distLEN,MAX); memset(vis,0,sizeof vis); int ans0; dist[1]0; //如…

dropbox文件_Dropbox即將發布的擴展程序更新將添加更多文件編輯支持,包括Pixlr照片...

dropbox文件Dropbox is perhaps the best-known cloud storage platform for consumers, but it’s hoping to become something more. With an upcoming overhaul to its user tools, Dropbox will add more complex editing tools, in addition to what it already provides …

黑客竊取思科、IBM與甲骨文認證管理系統內的敏感數據

目前一套被思科、F5、IBM以及甲骨文等企業所廣泛使用的認證管理系統(即Credential Manager System)正面臨著數據泄露風險&#xff0c;其中的敏感數據也許已經被黑客們所獲取。 根據Pearson VUE(主營計算機測試方案開發與交付)發布的一項公告&#xff0c;某惡意軟件已經藏身于該…

Spring下載地址

下載地址&#xff1a;https://repo.spring.io/libs-release-local/org/springframework/spring/ 進入后可選擇下載版本&#xff0c;選擇版本后&#xff0c;進入目錄結構。其中dist是最終發布版本&#xff0c;包含開發所需lib和源碼。docs是開發文檔。schema是一些約束文件。 Do…

C#字符串:轉數組、數字

1.List<string> 轉數組&#xff0c;字符串 string[] strs list.ToArray();string s string.Join(",", list.ToArray());//數組轉list string[] strArr new string[3] { "1", "2", "3" }; List<string> strList strArr…