C++開發:結構體作為函數形參的值傳遞與引用傳遞

筆者定義了一個結構體變量,用于作為函數的形參,定義如下:

struct CardParameters {float* Average = nullptr;int averageSize = 0;
}; 

需求描述:結構體變量作為函數的形參,在函數體中給指針變量分配內存空間并賦值,在函數調用結束后,在外部可以訪問這些數據,用于其他用途。

情形1:結構體作為函數形參時,值傳遞

函數的聲明:

void collectData(CardParameters card); // 值傳遞,不會修改原對象

函數的調用:

CardParameters CardSet;
CardSet.averageSize = 10;collectData(CardSet); 

函數體示例:

void collectData(CardParameters card) {card.Average = new float[10]; card.averageSize = 10;for (int i = 0; i < card.averageSize; ++i) {card.Average[i] = static_cast<float>(i);}
}

值傳遞時,函數內部操作的是結構體的一個拷貝(copy),你在函數里對 card.Average 的賦值只影響這個拷貝,不會影響到外面的原始結構體 CardSet。函數結束后,拷貝被銷毀,里面的 Average 指針也隨之失效,而外部的 CardSet.Average 還是原來的值。

在函數調用語句結束后,筆者試圖訪問結構體中的成員變量,發現CardSet.Average = nullptr,CardSet.averageSize = 0,也就是說結構體中變量的值還是初值,并沒有任何改變。

情形2:結構體作為函數形參時,引用傳遞

函數的聲明:

void collectData(CardParameters &card); // 引用傳遞,會修改原對象

函數體示例:

void collectData(CardParameters &card) { // 注意這里的 &card.averageSize = 10;card.Average = new float[card.averageSize];for (int i = 0; i < card.averageSize; ++i) {card.Average[i] = static_cast<float>(i);}// 打印驗證是否成功for (int i = 0; i < card.averageSize; ++i) {qDebug() << "Data[" << i << "] = " << card.Average[i];}
}

函數的調用:

CardParameters CardSet;
CardSet.averageSize = 10;collectData(CardSet); // 傳入引用,函數內的修改會影響外部變量// 現在可以安全訪問 CardSet.Average
if (CardSet.Average != nullptr) {for (int i = 0; i < CardSet.averageSize; ++i) {qDebug() << "外部訪問: " << CardSet.Average[i];}
}

在函數調用結束后,外部訪問結構體中的變量,其值和函數體中賦值的結果一致。

兩種情形在使用完指針變量后都需要手動釋放內存,否則會出現內存泄漏。

delete[] CardSet.Average;
CardSet.Average = nullptr;
CardSet.averageSize = 0;

總結:

1. 值傳遞

定義:將結構體對象復制一份傳入函數,函數內部操作的是副本

特點:

特性描述
操作對象函數內部操作的是原始結構體的一個拷貝
修改影響不會影響外部原始結構體
性能開銷如果結構體較大,會有性能損耗(需要復制)
生命周期副本生命周期僅限于函數體內,函數結束后自動銷毀

省流:在函數體中修改結構體中的任何變量,在函數調用結束后自動失效?

如果結構體中含有指針,并且沒有深拷貝邏輯,容易造成淺拷貝問題(兩個指針指向同一塊內存)。

2. 引用傳遞

定義:將結構體變量的引用傳入函數,函數內部操作的是原始對象本身

特點:

特性描述
操作對象函數內部直接操作原始結構體
修改影響會直接影響外部原始結構體
性能開銷高效,不需要復制整個結構體
生命周期不涉及副本,不影響原始對象生命周期

在函數體中修改結構體中的任何變量,在函數調用結束后值仍然保留適合用于數據采集、配置設置等需要“輸出”的場景

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

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

相關文章

【unity小技巧】在 Unity 中將 2D 精靈添加到 3D 游戲中,并實現陰影投射效果,實現類《八分旅人》《饑荒》等等的2.5D游戲效果

注意&#xff1a;考慮到unity小技巧的內容比較多&#xff0c;我將該內容分開&#xff0c;并全部整合放在【unity小技巧】專欄里&#xff0c;感興趣的小伙伴可以前往逐一查看學習。 文章目錄 前言實戰1、在3D場景中&#xff0c;新建一些不同形狀的2D圖片2、我們新建一個Lit材質3…

Rust 內存結構:深入解析

Rust 的內存管理系統是其核心特性之一&#xff0c;結合了手動內存管理的效率與自動內存管理的安全性。以下是 Rust 內存結構的全面解析&#xff1a; 內存布局概覽 ----------------------- | 代碼段 (Text) | 只讀&#xff0c;存儲可執行指令 ----------------------…

【Chrome】‘Good助手‘ 擴展程序使用介紹

這是我開發的一款 Chrome 瀏覽器擴展程序&#xff0c;目前主要集成了‘AI對話‘&#xff0c;’總結頁面’&#xff0c;‘基于頁面問答’等功能&#xff0c;最近幾天我也將寫一篇介紹如何開發 chrome 擴展程序的博客&#xff0c;帶你了解如何開發屬于自己的插件。 注&#xff1…

基于mysql8.0.27部署1主2從的MHA集群

目錄 一、mysql概述 1.1、關系型數據庫 1.2、MySQL數據庫 1.3、RDBMS術語 二、mysql的部署 2.1、拉取mysql 2.2、解壓 2.3、 改名 2.4、 指定安裝文件位置 2.5、 創建用戶組 2.6、 修改mysql配置文件 2.7、創建data文件夾 2.8、更改mysql目錄權限 2.9、初始化數據…

Highcharts 安裝使用教程

一、Highcharts 簡介 Highcharts 是一款使用 JavaScript 編寫的前端數據可視化庫&#xff0c;支持折線圖、柱狀圖、餅圖、面積圖、散點圖等多種圖表類型&#xff0c;特點是渲染性能優秀、交互豐富、兼容性強&#xff0c;適合構建商業圖表、統計報表等。 二、Highcharts 安裝方…

Qt中的坐標系

Qt中的坐標系 1.坐標系概念2.數學坐標系VS計算機坐標系3.Qt坐標系4.像素 &#x1f31f;&#x1f31f;hello&#xff0c;各位讀者大大們你們好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列專欄&#xff1a;【Qt的學習】 &#x1f4dd;&#x1f4dd;本篇內容&am…

C++原子類型操作與內存序

C原子類型操作與內存序詳解 這段內容深入介紹了C標準原子類型的操作接口、內存序語義及使用規范。以下是關鍵知識點的分層解析&#xff1a; 一、原子類型的命名規則與類型映射 C提供兩種方式表示原子類型&#xff1a; 模板特化形式&#xff1a;std::atomic<T>別名形式…

互聯網摸魚日報(2025-07-07)

互聯網摸魚日報(2025-07-07) 鈦媒體 一場突如其來的“召回潮”&#xff0c;點燃中國制造的“靈魂拷問” 史上最大外賣補貼戰開打&#xff0c;美團聚攏資源迎戰“巨無霸” 1315億加冕潮汕女首富&#xff0c;“最強打工妹”劍指港股 用14346字&#xff0c;講透上市前必做的10…

七牛云Java開發面試題及參考答案

詳述 Java 方法重載的機制與應用場景 Java 方法重載&#xff08;Method Overloading&#xff09;是面向對象編程中的重要特性&#xff0c;它允許同一個類中存在多個同名但參數列表不同的方法。這種機制為代碼提供了靈活性和可讀性&#xff0c;使得開發者可以用統一的方法名處理…

.net core mvc部署到win10本地的Ubuntu上

將一個 .NET Core MVC 應用部署到 Windows 10 上通過 WSL 安裝的 Ubuntu 環境中&#xff0c;可以分為幾個步驟來完成。以下是詳細的指南&#xff1a;準備工作確保你的Ubuntu環境已安裝.NET SDK&#xff1a;首先&#xff0c;你需要在WSL中的Ubuntu上安裝.NET SDK。可以通過以下命…

機器人VLA模型(Vision-Language-Action)

一、VLA模型的技術架構與核心原理 VLA&#xff08;Vision-Language-Action&#xff09;模型的核心是構建視覺、語言、動作的多模態閉環系統&#xff0c;實現從感知到執行的端到端映射。其技術架構可細分為四個關鍵模塊&#xff1a; 1. 多模態編碼器 視覺編碼器&#xff1a; …

單點登錄SSO的演進和最佳實踐,含springBoot 實現(Java版本)

一、單點登錄&#xff08;SSO&#xff09;概述 單點登錄&#xff08;SSO, Single Sign-On&#xff09;是一種認證機制&#xff0c;允許用戶只需登錄一次&#xff0c;即可訪問多個相互信任的系統或應用&#xff0c;而不需要為每個系統重復登錄。 二、SSO 演進路徑 我們可以從以…

Python----OpenCV(圖像増強——高通濾波(索貝爾算子、沙爾算子、拉普拉斯算子),圖像浮雕與特效處理)

一、 高通濾波 高通濾波是對圖像進行卷積操作&#xff0c;以保留圖像中的快速變化部分&#xff08;如邊緣和細節&#xff09;&#xff0c;同時抑 制低頻分量&#xff08;如大面積平坦區域&#xff09;。 應用場景 邊緣檢測&#xff1a;提取物體輪廓和邊界。特征提取&#xff…

oracle 恢復

RECOVER DATABASE USING BACKUP CONTROLFILE “用備份的控制文件推動數據庫恢復”。-- 檢查控制文件記錄的當前SCN (V$DATABASE) SELECT CURRENT_SCN FROM V$DATABASE; -- 檢查數據文件頭SCN (V$DATAFILE_HEADER) SELECT FILE#, CHECKPOINT_CHANGE# FROM V$DATAFILE_HEADER;-…

京東商品詳情SKU數據采集的難點有哪些?

京東商品詳情 SKU 數據采集過程中&#xff0c;由于平臺的技術防護、數據結構特性及合規性要求&#xff0c;會面臨諸多難點&#xff0c;具體如下&#xff1a;一、反爬蟲機制的限制京東作為大型電商平臺&#xff0c;擁有成熟且嚴格的反爬蟲系統&#xff0c;這是采集時最核心的障礙…

修復手機液晶面板顯性橫向線性不良定位及相關液晶線路激光修復原理

摘要 手機液晶面板顯性橫向線性不良嚴重影響屏幕顯示效果&#xff0c;其產生與液晶線路斷路、短路或信號傳輸異常密切相關。精準定位線性不良區域是修復的關鍵前提&#xff0c;激光修復技術憑借高能量密度與非接觸特性&#xff0c;能夠有效修復相關液晶線路故障。本文分析顯性…

如何解決Spring Boot中@Valid對List校驗失效問題

在Spring Boot應用開發中&#xff0c;我們經常需要對傳入的請求參數進行校驗&#xff0c;以確保數據的合法性和安全性。然而&#xff0c;當我們嘗試對列表&#xff08;List&#xff09;類型的參數進行校驗時&#xff0c;可能會遇到校驗失效的問題。本文將詳細探討這一問題的失效…

云原生環境下部署大語言模型服務:以 DeepSeek 為例的實戰教程

&#x1f4dd;個人主頁&#x1f339;&#xff1a;一ge科研小菜雞-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 一、引言 隨著 DeepSeek、Qwen、ChatGLM 等大語言模型&#xff08;LLM&#xff09;的開放與普及&#xff0c;企業將其私有化部署…

【Spring篇08】:理解自動裝配,從spring.factories到.imports剖析

文章目錄1. 自動化裝配的起點&#xff1a;SpringBootApplication2. 自動化裝配的核心機制&#xff1a;EnableAutoConfiguration 和 AutoConfigurationImportSelector3. 自動化配置的注冊方式&#xff1a;spring.factories 與 .imports3.1 早期版本&#xff1a;META-INF/spring.…

前置代理重構網絡訪問的「中轉站」

某跨境電商通過前置代理構建賬號隔離體系&#xff0c;將亞馬遜店鋪關聯風險降低85%&#xff1b;某企業利用前置代理過濾惡意流量&#xff0c;網絡攻擊攔截率提升70%。在復雜的網絡環境中&#xff0c;前置代理作為客戶端與目標服務器之間的「中間樞紐」&#xff0c;正成為跨境訪…