【C語言】指針作為參數(傳值調用vs傳址調用)

前言

在前面講了那些指針相關的內容后,是時候探討一下指針有什么作用了。

在C語言中,指針有多種各不相同的應用,在本篇文章中,我們探討一下指針作為函數參數的作用(對比傳值與傳址兩種不同函數調用方式)。

引子

我們不妨先復習一下形式參數和實際參數(下面簡稱為形參和實參)之間的差異。形參(parameter)出現在函數定義中,它們以假名字(只是一種形象的說法)來表示函數調用時需要提供的值;實參(argument)則是出現在函數調用語句中的表達式。

傳值調用

現在我們不妨寫一個函數用來交換兩個整型變量的值:

我們發現,a和b的值在調用函數Swap后并沒有被交換。如果你不知道為什么會這樣,說明你對形參的相關知識已經遺忘了,在這我來替你回憶一下:

當我們使用值傳遞:調用函數時會計算出每個實際參數的值并且把它賦給相應的形式參數。在函數執行時,對形參的改變不會影響實參的值,因為形參中是實參值的副本。

從效果上來說,每個形參的行為就像把變量初始化為與之相匹配的實參的值。

通俗點解釋就是我們修改了值的只是實參的復制品,無法真正修改到實參。

你可能會想著,那就把兩個數值返回唄,然后你會想起函數無法返回兩個數。所以這個解決辦法不能解決我們的問題。

那么,我們真的就無能為力了嗎?并不是這樣的。只要我們將傳值調用變為傳址調用,也就是將指針作為形參,就可以達到目的。

傳址調用

現在我們可以修改這個代碼:

可以看到,現在我們的a與b的值就交換成功了。

這是為什么呢?這時我們需要畫圖來理解:

這是我們修改函數之前的示意圖,此時我們main函數中創建了a和b,但我們將它們傳到Swap時,x和y只是a和b的復制品,它們有自己的地址,所以改變x和y地址里存放的值,對a和b地址處的值的變化是無能為力的。

而當我們將函數改為傳址調用時,示意圖就會變成這樣:

可以看到此時我們通過解引用是有能力間接訪問這個地址的內容的,當我們對解引用的值進行交換,我們就是真的將這兩個地址處存放的值進行了交換,所以a和b的值真的被我們交換了。前面說到形參是復制實參的值,這一點沒有問題,只不過我們復制的是地址,相當于我們直接拿著地址去修改這個地址存放的值,這是能達成目的的。

總結

傳址調用,可以讓函數和主調函數之間建立真正的聯系,在函數中可以修改主調函數中的變量。所以我們可以知道,當我們只是需要主調函數中的變量值來實現計算,可以采用傳值調用。舉個例子:

而如果需要修改主調函數中的變量的值,就需要傳址調用了。?

到此,本文就結束了,希望大家閱讀愉快^_^

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

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

相關文章

【QGIS入門實戰精品教程】10.7: 基于DEM的地形因子分析(坡度、坡向、粗糙度、山體陰影、耐用指數)

文章目錄 一、加載dem二、山體陰影三、坡度四、坡向五、地形耐用指數六、地形位置指數七、地表粗糙度一、加載dem 二、山體陰影 方法一:符號系統 利用符號系統中的山體陰影,渲染出陰影效果。 方法二:山體陰影工具 該算法計算輸入中的數字化地形模型的山體陰影。根據太陽的位…

2024 年 5 個 GO REST API 框架

什么是API? API是一個軟件解決方案,作為中介,使兩個應用程序能夠相互交互。以下一些特征讓API變得更加有用和有價值: 遵守REST和HTTP等易于訪問、廣泛理解和開發人員友好的標準。API不僅僅是幾行代碼;這些是為移動開…

kali下載zsteg和stegpy

1.kali下載zsteg 從 GitHub 上克隆zsteg到kali git clone https://github.com/zed-0xff/zsteg 切換目錄 cd zsteg 用于安裝名為 zsteg 的 Ruby Gem 包 gem install zsteg 2.kali下載stegpy 下載網站內的stegpy-master壓縮包GitCode - 開發者的代碼家園 并拉到kali中 切換到s…

python數據分析——數據可視化(圖形繪制)

數據可視化(圖形繪制基礎) 前言一、圖形繪制基礎Matplotlib簡介使用過程sin函數示例 二、常用圖形繪制折線圖的繪制plot示例 散點圖的繪制scatter()示例 柱狀圖的繪制bar示例 箱型圖繪制plot.box示例 餅狀圖的繪制pie示例 三、圖形繪制的組合情況多個折線…

Sql Sever刪除數據庫時提示數據庫正在被使用,解決辦法

報錯解釋: 當您嘗試刪除SQL Server中的某個對象(如數據庫、表等)時,如果有程序或進程正在使用該對象,您可能會收到一個錯誤信息,提示該對象正被使用。這通常是因為還有一個或多個數據庫連接仍然保持著對該…

易備數據備份軟件: 快速備份 MySQL\SQL Server\Oracle\泛微 OA 數據庫

易備數據備份軟件支持對 SQL Server、Oracle、MySQL、PostgreSQL、MariaDB、泛微 OA 等數據庫進行快速備份,備份過程不會對任何服務造成中斷。 使用一份授權,可以備份無限量的數據庫,不管數據庫服務器是否在本機、本地網絡、或是遠程網絡。可…

【C++風云錄】光芒背后的功臣:醫療影像處理與醫學成像

打開技術寶庫:從視覺分析到醫學影像 前言 在信息技術的日益發展下,各種開源工具庫的出現大大促進了軟件開發的進步。本文將對六種主要的開放源碼軟件庫進行詳細的介紹和分析,包括其概述,主要功能以及應用實施案例。 歡迎訂閱專欄…

Vitis HLS 學習筆記--控制驅動TLP-處理deadlock

目錄 1. 簡介 2. 代碼解析 2.1 HLS kernel代碼 2.2 查看接口報告 2.3 TestBench 2.4 Dataflow 報告 3. Takeaways 4. 總結 1. 簡介 本文是對《Hardware Acceleration Tutorials: FIFO Sizing for Performance and Avoiding Deadlocks》實驗內容的詳細解釋。 首先需要…

如何實現高內聚低耦合

一、定義 內聚:一個模塊內各元素間,結合的緊密程度。 耦合:模塊之間聯系緊密程度 二、高內聚、低耦合的利弊 1、代碼關系過于緊密,往往改一小段代碼,需要整個項目做很大的改動。所以在實際開發中應該盡量避免過高的…

Python常見面試題(二)——numpy和pandas

一、NumPy和Pandas間的區別與練習 功能定位 NumPy主要用于數值計算,提供了多維數組對象ndarray,支持數組操作、線性代數、隨機數生成等功能。 Pandas則建立在NumPy之上,提供了更高級的數據結構,主要用于數據分析,尤…

自動駕駛場景中的長尾問題怎么解決?

自動駕駛長尾問題是指自動駕駛汽車中的邊緣情況,即發生概率較低的可能場景。感知的長尾問題是當前限制單車智能自動駕駛車輛運行設計域的主要原因之一。自動駕駛的底層架構和大部分技術問題已經被解決,剩下的5%的長尾問題,逐漸成了制約自動駕…

huggingface 筆記:查看GPU占用情況

0 準備部分 0.1 創建虛擬數據 import numpy as npfrom datasets import Datasetseq_len, dataset_size 512, 512 dummy_data {"input_ids": np.random.randint(100, 30000, (dataset_size, seq_len)),"labels": np.random.randint(0, 1, (dataset_size…

學習和分享關于 Vue.js 的路由(vue-router)

學習和分享關于 Vue.js 的路由(vue-router)是一個非常有價值的主題,因為路由是構建單頁應用程序(SPA)的核心部分。本文將介紹 Vue.js 路由的基本概念和實現,并展示一個典型的項目目錄結構。 目錄 Vue.js 路…

【代碼隨想錄訓練營】【Day 29】【回溯-3】| Leetcode 39, 41, 131

【代碼隨想錄訓練營】【Day 29】【回溯-3】| Leetcode 39, 41, 131 需強化知識點 startInex作用:一是處理是否可以有重復值,二是實現縱向遍歷(不能沒有)去重要在數組有序的前提下進行分割問題 題目 39.…

工業控制2D組態界面,丑是丑了點,但非常實用。

工業控制的2D組態界面是用于監控和控制工業過程的界面。它通常具有以下特征: 實時數據顯示:2D組態界面能夠實時顯示傳感器和設備的數據,如溫度、壓力、流量等。這些數據以圖表、儀表盤、數字顯示等形式呈現,使操作人員能夠實時了解…

Android:使用Kotlin搭建MVVM架構模式

一、簡介Android MVVM架構模式 MVVM全稱:Model、View、ViewModel; Model:負責數據的請求、解析、過濾等數據層操作,其中Repository: 提供數據的 API(從本地或者網絡)。View:負責視圖部分展示Vie…

Spring (18)什么是JdbcTemplate

JdbcTemplate 是 Spring 框架提供的一個主要的類,旨在簡化傳統 JDBC 的使用。它處理了諸如連接管理、異常處理等繁瑣的低級任務,讓開發者可以更專注于執行 SQL 語句和處理結果。JdbcTemplate 屬于 Spring JDBC 模塊(spring-jdbc)&…

每日力扣刷題day05(小白簡單題)

文章目錄 2024.5.26(5題)1446.連續字符題解一題解二 2824.統計和小于目標的下標對數目題解一題解二 1768.交替合并字符串題解一題解二題解三 796.旋轉字符串題解一題解二 1304.和為零的 N 個不同整數題解一題解二 2024.5.26(5題) …

快速冪求逆元與逆元

我上一篇博客鏈接寫的是多個數求乘法逆元而快速冪求逆元用于單個數求乘法逆元 逆元是對分數取模用的 對于除法取模不成立,即(a/b)%p≠(a%p/b%p)%p。求逆元的思路:(一般ACM的題目都是對1e97這種素數取模,所以gcd(a,p)1)a*b1(mod p) > b1/a…

[Algorithm][動態規劃][簡單多狀態DP問題][按摩師][打家劫舍Ⅱ][刪除并獲得點數][粉刷房子]詳細講解

目錄 1.按摩師1.題目鏈接2.算法思路詳解3.代碼實現 2.打家劫舍 II1.題目鏈接2.算法思路詳解3.代碼實現 3.刪除并獲得點數1.題目鏈接2.算法思路詳解3.代碼實現 4.粉刷房子1.題目鏈接2.算法思路詳解3.代碼實現 1.按摩師 1.題目鏈接 按摩師 2.算法思路詳解 思路: 確…