C++函數(shù)三種傳參形式(指針傳遞、引用傳遞、值傳遞)
前言
不論是哪種參數(shù)傳遞方式,都有形參和實(shí)參之分,都會(huì)在調(diào)用函數(shù)時(shí)進(jìn)行一次復(fù)制,將實(shí)參的值賦予形參。對(duì)于值傳遞,實(shí)參形參概念較好區(qū)分,但對(duì)于地址傳遞,形參實(shí)參指向的地址相同,可能會(huì)產(chǎn)生操作的是同一變量的想法,實(shí)則不然。(這也是理解二級(jí)指針作用的核心知識(shí)點(diǎn))
指針傳遞
變量形式、函數(shù)原型及對(duì)應(yīng)傳參形式:
- 變量:int a = 0; int *b = 0;
- 函數(shù)原型:void func(int *arg);
- 傳參形式:func(&a); func(b);
解釋:
函數(shù)得參數(shù)類型是int指針類型,接受的參數(shù)的一個(gè)地址。因此,對(duì)于普通變量a,需要先用&符號(hào)取地址后傳入,故傳入&a。對(duì)于指針b,指針就是地址,因此直接傳入b即可。
#include <iostream> using namespace std; void exchange(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } int main() { int x, y; cin >> x >> y; exchange(&x, &y); cout << x << y; }
引用傳遞
最復(fù)雜的是引用傳遞。此次只講解最基礎(chǔ)簡(jiǎn)單的使用。
變量形式、函數(shù)原型及對(duì)于傳參形式:
- 變量:int a = 0; int *b = 0;
- 函數(shù)原型:void func(int &arg);
- 傳參形式:func(a); func(b);func(*b)
解釋:
函數(shù)的參數(shù)類型是引用類型。對(duì)于變量a,直接傳入a。對(duì)于指針b,可以選擇傳入地址b或者傳入b指向的值*b。
區(qū)別:待定
引用的本質(zhì):待定
#include <iostream> using namespace std; void exchange(int &a, int &b) { int temp; temp = a; a = b; b = temp; } int main() { int x, y; cin >> x >> y; exchange(x, y); cout << x << " " << y; }
值傳遞
變量形式、函數(shù)原型及對(duì)應(yīng)傳參形式:
- 變量:int a = 0; int *b = 0;
- 函數(shù)原型:void func(int arg);
- 傳參形式:func(a); func(*b);
解釋:
函數(shù)的參數(shù)類型是int類型,接收的值是int型變量的值。因此,對(duì)于變量a,本身就是int型變量,故直接傳入。對(duì)于指針變量b,是需要用*符號(hào)進(jìn)行解引用獲取指針指向的值,故傳入*b。
#include <iostream> using namespace std; void exchange(int a, int b) { int temp; temp = a; a = b; b = temp; } int main() { int x, y; cin >> x >> y; exchange(x, y); cout << x << " " << y; }
總結(jié):
1.引用傳遞和值傳遞都是傳地址,可理解為實(shí)參和形參的內(nèi)存地址相同,在函數(shù)中的賦值操作在函數(shù)結(jié)束后仍會(huì)保留(只要被賦值的變量仍存在)。而值傳遞傳入的是實(shí)參的值,調(diào)用函數(shù)時(shí)會(huì)進(jìn)行拷貝操作將實(shí)參的值賦予形參,實(shí)參和形參的地址不同,因此在函數(shù)體內(nèi)對(duì)形參的賦值操作不會(huì)改變實(shí)參的值。
到此這篇關(guān)于C++函數(shù)三種傳參形式(指針傳遞、引用傳遞、值傳遞)的文章就介紹到這了,更多相關(guān)C++函數(shù)傳參內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++基于Boost.Asio實(shí)現(xiàn)端口映射器的過(guò)程詳解
Boost.Asio 是一個(gè)功能強(qiáng)大的 C++ 庫(kù),用于異步編程和網(wǎng)絡(luò)編程,它提供了跨平臺(tái)的異步 I/O 操作,在這篇文章中,我們將深入分析一個(gè)使用 Boost.Asio 實(shí)現(xiàn)的簡(jiǎn)單端口映射服務(wù)器,文中有詳細(xì)的代碼講解,需要的朋友可以參考下2023-11-11C++11 <future>中std::promise 介紹
這篇文章主要介紹了C++11 <future>中std::promise 介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02C語(yǔ)言實(shí)現(xiàn)的一個(gè)萬(wàn)年歷小程序
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)的一個(gè)萬(wàn)年歷小程序,具有一定的參考價(jià)值,做C語(yǔ)言日期計(jì)算的朋友可以參考下2014-07-07C語(yǔ)言數(shù)組任意位置插入一個(gè)元素方法
這篇文章主要給大家分享C語(yǔ)言數(shù)組任意位置插入一個(gè)元素方法,2021-11-11C++通過(guò)ofstream和ifstream實(shí)現(xiàn)文件讀寫(xiě)
本文詳細(xì)介紹了C++中通過(guò)ofstream和ifstream進(jìn)行文件的讀寫(xiě)操作,包括文件打開(kāi)模式的選擇、錯(cuò)誤處理策略以及二進(jìn)制文件的特殊處理,重點(diǎn)講解了如何使用這些類進(jìn)行文本和二進(jìn)制文件的讀寫(xiě),并強(qiáng)調(diào)了正確處理文件操作中可能出現(xiàn)的錯(cuò)誤,需要的朋友可以參考下2025-03-03