C語言函數的參數傳遞和C++函數的參數傳遞

文章目錄

  • C語言
    • 值傳遞
    • 地址傳遞
  • C++
    • 引用傳遞

C語言

值傳遞

這種方式使用變量、數組元素作為函數參數,實際是將實參的值復制到形參相應的存儲單元中,即形參和實參分別占用不同的存儲單元,這種傳遞方式稱為“參數的值傳遞”。在調用結束后,形參的存儲單元被釋放,而形參值的任何變化都不會影響到實參的值,實參的存儲單元仍保留并維持數值不變。
例子:

#include <stdio.h>
void swap(int x, int y) {int tmp;tmp = x;x = y;y = tmp;printf("x = %d, y = %d\n", x, y);
}
int main() {int a = 10;int b = 20;swap(a, b);printf("a = %d, b = %d\n", a, b);return 0;
}

運行結果:
在這里插入圖片描述
對上面的例子進行修改:

#include <stdio.h>void test(int x) {x = 1024;printf("test函數內部 x = %d\n", x);printf("x的地址為:%p\n", &x); 
} int main() {int x = 1;printf("調用test前 x = %d\n", x);  //1test(x);  //1024printf("x的地址為:%p\n", &x);printf("調用test后 x = %d\n", x);  //1return 0;
} 

可以看出運行結果與我們之前描述的一致。

地址傳遞

這種方式使用數組名或者指針作為函數參數,傳遞的是該數組的首地址或指針的值,而形參接收到的是地址,即指向實參的存儲單元,形參和實參占用相同的存儲單元,這種傳遞方式稱為“參數的地址傳遞”。
地址傳遞的特點是形參并不存在存儲空間,編譯系統不為形參數組分配內存。數組名或指針就是一組連續空間的首地址。因此在數組名或指針作函數參數時所進行的傳送只是地址傳送,形參在取得該首地址之后,與實參共同擁有一段內存空間,形參的變化也就是實參的變化

#include <stdio.h>// 修改1:參數改為指針類型
void test(int *px) { // px指向main中的x*px = 1024; // 通過指針修改原變量printf("test函數內部 *px = %d\n", *px); // 1024printf("px的值為:%p (指向main中的x)\n", px); printf("px自身地址為:%p\n", &px); // 指針自身的地址,也就是指向px的指針,又叫做二級指針// int **ppx = &px;
} int main() {int x = 1;printf("調用test前 x = %d\n", x); //1printf("x的地址為:%p\n", &x);// 修改2:傳遞x的地址test(&x); // 傳遞x的地址printf("調用test后 x = %d\n", x); //1024 被修改了return 0;
}

運行結果:
在這里插入圖片描述
此外,如果想修改main函數中x的值,還有兩種辦法。

  1. 直接返回修改后的值
    這種方法適用于單返回值的情況:
#include <stdio.h>int test(int x) {x = 1024; // 修改局部副本return x; // 返回新值
} int main() {int x = 1;printf("調用test前 x = %d\n", x); //1// 獲取返回值并賦值給xx = test(x); printf("調用test后 x = %d\n", x); //1024return 0;
}

在這里插入圖片描述
2. 使用全局變量

#include <stdio.h>int x; // 全局變量void test() {x = 1024; // 直接修改全局變量
} int main() {x = 1;printf("調用test前 x = %d\n", x); //1test(); // 不需要傳遞參數printf("調用test后 x = %d\n", x); //1024return 0;
}

但是,使用全局變量通常不是好的做法,因為它使得程序難以維護和理解。

C++

引用傳遞

<cstdio> 是 C++ 標準庫中的一個頭文件,它包含了 C 語言標準 I/O 庫的 C++ 封裝,主要用于文件的輸入和輸出操作。
C++引用聲明的語法為:數據類型& 引用名 = 被引用變量;,作為函數參數:返回值類型 函數名(數據類型& 參數名)
理解:引用不是新變量,而是已存在變量的別名,引用在編譯后直接綁定到目標地址,不產生額外內存分配。
形式上,聲明的形式具有相似性:

int* ptr;   // 指針聲明
int& ref;   // 引用聲明// 清晰區分參數類型
void func(int param);     // 值傳遞
void func(int* param);    // 指針傳遞
void func(int& param);    // 引用傳遞

代碼如下:

#include <iostream>using namespace std;int main() {int person = 10;         // 實體:變量personint& idCard = person;    // 引用idCard是person的別名person = 20;             // 通過原名修改cout << idCard;          // 輸出20 - 通過別名訪問idCard = 30;             // 通過別名修改cout << person;          // 輸出30 - 原名也隨之改變int original = 42;int& alias = original;cout << "變量地址: " << &original << endl;  cout << "引用地址: " << &alias << endl;     
}

在這里插入圖片描述

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

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

相關文章

設計模式-三大工廠

工廠模式有三種&#xff0c;分別是簡單工廠模式、工廠方法模式、抽象工廠模式。三種模式從前到后越來越抽象&#xff0c;也更具有一般性。 設計模式 優點 缺點 簡單工廠 1.實現了對責任的分割&#xff0c;它提供了專門的工廠類用于創建對象。 1.違背了開閉原則。 2.使用了…

在 AI 工具海洋中掌舵:Cherry Studio 如何成為你的統一指揮中心

01 被 AI 工具包圍的知識工作者現狀 在這個 AI 爆發的時代&#xff0c;知識工作者的工具庫正經歷前所未有的擴容。以我為例&#xff0c;按平臺類型梳理日常使用的 AI 工具&#xff0c;已然形成三層矩陣&#xff1a; 「云端智能助手」&#xff1a;Kimi、豆包、ChatGPT、Gemini…

Java 線程池技術深度解析與代碼實戰

為什么線程池總在深夜崩潰&#xff1f; 昨天我這項目又經歷了一次爆破——路由推送服務突然崩潰&#xff0c;排查發現線程池隊列堆積了幾萬任務直接把內存撐爆。早上起來看見人都麻了&#xff0c;線程池用不好&#xff0c;分分鐘變系統炸彈。今天我們就來系統梳理線程池的實戰…

Gradio可視化構建聊天機器人

Gradio是一個Python庫&#xff0c;專門用于快速構建和部署機器學習模型的Web界面。它的名字來源于"Gradient"&#xff08;梯度&#xff09;&#xff0c;最初是為了讓機器學習開發者能夠快速展示他們的模型而設計的。 1. Gradio是什么&#xff1f; 核心概念 快速原…

selenium如何識別條形驗證碼,自動輸入驗證碼

在自動化測試或網頁爬取中&#xff0c;識別驗證碼是常見的難點。Selenium 本身不具備直接識別驗證碼的能力&#xff0c;但可以通過結合第三方工具、OCR 技術或人工介入等方式解決。以下是多種可行方案的詳細實現思路及代碼示例&#xff1a; 一、方案一&#xff1a;使用第三方驗…

SAP將指定EXCEL工作SHEET的數據上傳到內表

SAP將指定EXCEL工作SHEET的數據上傳到內表 本文描述了一個SAP ABAP類方法upload_excel_2internaltab&#xff0c;用于將Excel文件數據上傳到內部表。主要功能包括&#xff1a; 驗證Excel行列范圍有效性&#xff0c;若起始值大于結束值則拋出異常檢查文件是否存在&#xff0c;支…

Spring Boot(九十三):Springboot 整合cfx實現webservice接口

1 服務端 最近項目改造,有一些老項目接口協議是webservice soap1.1,這就需要我們提供webservice服務接口。在Spring Boot中整合CFX(CXF框架)以實現Web服務客戶端與服務端的功能,可以分為幾個步驟。下面我將詳細介紹如何在Spring Boot中設置一個Web服務端點,使用Apache CX…

Triton server的部署、構建、backend插件機制整體介紹

目錄 0 引言 1 什么是Trition inference server 2 Trition inference server部署 2.1 下載server 2.2 下載模型 2.3 實驗 3 triton inference server的構建 3.1 build時候需要哪些repo 3.2 構建過程做了什么 3.3 構建體驗 4 閱讀readme整體了解下backend機制 4.1 什…

Paimon在各大公司生產實踐和優化總結

這是一篇匯總和個人學習文章&#xff0c;主要目的是總結一下Paimon在各大公司的落地做一個學習筆記。 本文的主要內容是關于Paimon在各大公司包括Vivo、Shopee、阿里、抖音等公司的落地實踐&#xff0c;文末有文章來源地址&#xff0c;內容大概分為幾個部分&#xff1a; 1.引…

簡析自動駕駛產業鏈及其核心技術體系

一、自動駕駛產業鏈 自動駕駛產業鏈可以細分為感知層、決策層、執行層以及通信層等多個環節。上游部分主要包括提供環境感知所需的各種傳感器&#xff08;如激光雷達、毫米波雷達、攝像頭等&#xff09;、高精度地圖服務、定位系統以及其他相關硬件設備&#xff1b;中游涵蓋了…

第一節 布局與盒模型-Flex與Grid布局對比

一、核心特性對比?? 1. ??布局維度?? ??Flex 布局??&#xff1a; ??一維布局??&#xff1a;僅支持單方向&#xff08;水平或垂直&#xff09;的排列&#xff0c;通過 flex-direction 控制主軸方向&#xff08;row 或 column&#xff09;。??適用場景??&…

國產USRP X410 PRO/PRO+(相參版):寬頻段、大帶寬、多通道的4×4高性能軟件無線電設備

國產USRP X410 PRO/PRO(相參版)高性能軟件無線電&#xff0c;作為USRP X410的進階版本&#xff0c;X410 PRO/PRO核心均升級為Xilinx XCZU48DR FPGA芯片&#xff0c;顯著提升了信號處理能力。平臺延續了Xilinx Zynq UltraScale RFSoC的先進架構&#xff0c;集成四核ARM處理器及高…

Mac電腦-Office 2024 長期支持版(Excel、Word、PPT)

Office 2024 mac 是一款專為蘋果電腦用戶設計的高性能、高安全性的辦公軟件套裝 集成了Word、Excel、PowerPoint、Outlook等經典應用&#xff0c;為用戶提供了一站式的辦公解決方案。 不僅繼承了Office系列一貫的卓越性能&#xff0c;還在功能性和用戶體驗上進行了全面升級。…

vue2通過leaflet實現圖片點位回顯功能

需求&#xff1a;在圖片上標點了&#xff0c;需要根據標記點在圖片上進行回顯功能&#xff0c;并且不會根據窗口大小導致標記點移位 1.效果 2.下載插件 用到的是leaflet插件&#xff1a;一個交互式地圖 JavaScript 庫&#xff0c;我下載是 "leaflet": "^1.9.4&…

OmniDocBench:一鍵評測PDF解析算法

絕大多數文檔格式都能無損轉換至PDF&#xff0c;解決了PDF解析&#xff0c;也就相當于解決了絕大多數文檔的解析。所以&#xff0c;PDF解析算法是文檔服務的基石技術。 PDF解析算法目前有兩類技術路線 pipeline方法&#xff0c;整合layout analysis, OCR, formula/table reco…

[按鍵精靈安卓/ios腳本插件開發] 遍歷獲取LuaAuxLib函數庫命令輔助工具

LuaAuxLib庫 LuaAuxLib是按鍵精靈所有內置命令所在的庫文件&#xff0c;有多種方式來獲取LuaAuxLib庫下的函數命令&#xff0c;例如反編譯按鍵精靈手機端庫文件等。這里咱們來介紹一種淺顯易懂的方式來獲取&#xff0c;直接for循環遍歷獲取函數名。 ScanLuaAuxLib 我們寫一個自…

深度學習和計算機視覺的關系的理解

深度學習和計算機視覺的關系 深度學習作為人工智能的重要分支&#xff0c;近年來在計算機視覺領域取得了革命性突破。計算機視覺的核心任務包括圖像分類、目標檢測、語義分割等&#xff0c;而深度學習通過神經網絡模型自動學習圖像特征&#xff0c;極大提升了這些任務的準確率…

springboot開發項目 SLF4J+Logback日志框架集成【最終篇】

在這篇文章之前&#xff0c;實際對于 springboot和SLF4JLogback日志框架的使用 我已經分享過3篇關于springboot 日志的文章了。為什么會在寫這篇最終篇&#xff0c;因為 前3篇分享的關于springBoot框架日志的配置方案&#xff0c; 發現了一個問題&#xff1a;只有項目啟動的時候…

phpstudy無法啟動apache,80端口被占用,完美解決

phpstudy無法啟動apache&#xff0c;80端口被占用&#xff0c;完美解決 解決方法一(最推薦) 依次點擊網站-管理-修改 將端口由80改為81&#xff0c;再點擊確認后即可重新啟動apache。 需要注意的是&#xff0c;網站的訪問由127.0.0.1變為127.0.0.1:81。默認是80的端口所以可以不…

Loggers 配置解析(log4j.xml)

Loggers 配置解析 我們通過下面的例子來理解 log4j 的 Loggers 配置是如何決定日志輸出規則的。 <Loggers><!-- 根Logger&#xff1a;全局配置 --><Root level"debug"><AppenderRef ref"consoleAppender" level"info"/&g…