關(guān)于C++地址交換的實(shí)現(xiàn)
關(guān)于地址的交換實(shí)現(xiàn),我們要使用指針+引用的方式進(jìn)行,例如:
#include <iostream>
// 定義函數(shù)交換兩個(gè)整型指針的地址
void swapIntPtrAddresses(int* &ptr1, int* &ptr2) {
int *temp = ptr1;
ptr1 = ptr2;
ptr2 = temp;
}
int main() {
int num1 = 10;
int num2 = 20;
// 定義指向num1和num2的指針
int* ptr1 = &num1;
int* ptr2 = &num2;
std::cout << "交換前:" << std::endl;
std::cout << "ptr1指向的值:" << *ptr1 << ", ptr2指向的值:" << *ptr2 << std::endl;
std::cout << "ptr1指向的地址:" << ptr1 << ", ptr2指向的地址i:" << ptr2 << std::endl;
// 調(diào)用函數(shù)交換指針地址
swapIntPtrAddresses(ptr1, ptr2);
std::cout << "交換后:" << std::endl;
std::cout << "ptr1指向的值:" << *ptr1 << ", ptr2指向的值:" << *ptr2 << std::endl;
std::cout << "ptr1指向的地址:" << ptr1 << ", ptr2指向的地址:" << ptr2 << std::endl;
return 0;
}代碼運(yùn)行結(jié)果如下:

如果我們把代碼寫(xiě)成這樣,指針傳遞:
void swapIntPtrAddresses(int* ptr1, int* ptr2) {
int* temp = ptr1;
ptr1 = ptr2;
ptr2 = temp;
}它不能實(shí)現(xiàn)預(yù)期的交換指針地址的效果,原因如下:
在 C++ 中,函數(shù)參數(shù)的傳遞方式分為值傳遞、引用傳遞等。這里 swapIntPtrAddresses 函數(shù)的參數(shù) int* ptr1 和 int* ptr2 采用的是值傳遞方式。
當(dāng)進(jìn)行值傳遞時(shí),函數(shù)會(huì)為形參 ptr1 和 ptr2 分別創(chuàng)建獨(dú)立的副本,這些副本初始時(shí)的值是來(lái)自于實(shí)參的值(也就是傳入的指針的值)。
在函數(shù)內(nèi)部:
- 當(dāng)執(zhí)行
int* temp = ptr1;時(shí),是將形參ptr1的副本的值賦給了臨時(shí)指針變量temp。 - 接著執(zhí)行
ptr1 = ptr2;和ptr2 = temp;這兩步操作,僅僅是在修改形參ptr1和ptr2的副本的指向,而不是修改傳入的原始指針變量本身的指向。
也就是說(shuō),函數(shù)內(nèi)部對(duì)形參的這些操作都局限在函數(shù)內(nèi)部創(chuàng)建的這些副本的范圍內(nèi),一旦函數(shù)執(zhí)行完畢,這些副本就會(huì)被銷(xiāo)毀,而原始傳入的指針變量(實(shí)參)的值并沒(méi)有發(fā)生任何改變。
所以,要想實(shí)現(xiàn)交換指針地址的功能,就需要采用引用傳遞的方式來(lái)傳遞指針變量,就像前面提到的 void swapIntPtrAddresses(int*& ptr1, int*& ptr2) 這種形式,這樣函數(shù)內(nèi)部就能直接對(duì)傳入的原始指針變量進(jìn)行操作,從而實(shí)現(xiàn)真正的指針地址交換。
同理,單單使用引用傳遞也是改變不了地址的,只會(huì)改變值內(nèi)存上的值大小。
void swapIntPtrAddresses(int &ptr1, int &ptr2) {
int temp = ptr1;
ptr1 = ptr2;
ptr2 = temp;
}如果寫(xiě)成這樣呢?
這樣會(huì)報(bào)錯(cuò)。
int&* ptr1, int&* ptr2這種寫(xiě)法試圖將引用和指針以一種不符合 C++ 語(yǔ)法規(guī)則的方式組合在一起。
int& 表示一個(gè)整型引用類(lèi)型,它是某個(gè)整型變量的別名,本身并不是一個(gè)可以再被指向(也就是取地址)的實(shí)體。在 C++ 中,引用一旦綁定到一個(gè)變量上,就不能再重新綁定到其他變量,而且引用本身并沒(méi)有實(shí)際的存儲(chǔ)地址(它和所引用的變量共享地址),所以不能對(duì)引用進(jìn)行取地址操作,也就不能有類(lèi)似 int&* (指向引用的指針)這樣的類(lèi)型定義。
int* &ptr1, int* &ptr2(正確寫(xiě)法)
這種寫(xiě)法表示引用傳遞指針,它在很多場(chǎng)景下用于對(duì)指針變量本身進(jìn)行操作,比如前面提到的交換指針地址等操作。
int*表示一個(gè)指向整型的指針類(lèi)型,即這個(gè)變量存儲(chǔ)的是一個(gè)整型變量的地址。&ptr1和&ptr2表示對(duì)指針變量ptr1和ptr2進(jìn)行引用操作,所以int* &ptr1, int* &ptr2整體的含義是將指針變量ptr1和ptr2作為引用傳遞進(jìn)函數(shù)(也就是把指針變量本身當(dāng)作別名來(lái)對(duì)待,函數(shù)內(nèi)部可以直接對(duì)傳入的指針變量本身進(jìn)行操作)。
這里通過(guò)引用傳遞指針 ptr1 和 ptr2,使得函數(shù)內(nèi)部的操作能夠直接影響到傳入的原始指針變量,從而實(shí)現(xiàn)指針地址的交換等對(duì)指針變量本身進(jìn)行的操作。
以上就是關(guān)于C++地址交換的實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于C++地址交換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言編寫(xiě)學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言編寫(xiě)學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
C++實(shí)現(xiàn)LeetCode(121.買(mǎi)賣(mài)股票的最佳時(shí)間)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(121.買(mǎi)賣(mài)股票的最佳時(shí)間),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C++中運(yùn)算符重載的規(guī)則語(yǔ)法實(shí)例
今天小編就為大家分享一篇關(guān)于C++中運(yùn)算符重載的規(guī)則語(yǔ)法實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
使用VS2010創(chuàng)建MFC ActiveX工程項(xiàng)目
VS2010開(kāi)發(fā)ActiveX有兩種方法,分別是MFC和ATL。MFC開(kāi)過(guò)起來(lái)比較簡(jiǎn)單,但是最終生成的文件比較大,ATL是專(zhuān)門(mén)用來(lái)開(kāi)發(fā)ActiveX的,但是相對(duì)比較難,必須知道很多原理機(jī)制和API。咱先從MFC開(kāi)發(fā)ActiveX開(kāi)始吧。2015-06-06
詳解C語(yǔ)言?xún)?nèi)核字符串轉(zhuǎn)換方法
在內(nèi)核開(kāi)發(fā)模式下,初始化字符串也需要調(diào)用專(zhuān)用的初始化函數(shù),如下分別初始化ANSI和UNCODE字符串,本文我們就來(lái)看看代碼是如何實(shí)現(xiàn)的2022-09-09
c語(yǔ)言實(shí)現(xiàn)兩個(gè)值互相交換的函數(shù)
本文通過(guò)代碼給大家介紹c語(yǔ)言實(shí)現(xiàn)兩個(gè)值互相交換的函數(shù),通過(guò)實(shí)例代碼給大家講解的很詳細(xì),具有一定的參考借鑒價(jià)值,對(duì)c語(yǔ)言?xún)蓚€(gè)值互換函數(shù)相關(guān)知識(shí)感興趣的朋友一起看看吧2021-05-05
C語(yǔ)言中的自定義類(lèi)型之結(jié)構(gòu)體與枚舉和聯(lián)合詳解
今天我們來(lái)學(xué)習(xí)一下自定義類(lèi)型,自定義類(lèi)型包括結(jié)構(gòu)體、枚舉、聯(lián)合體,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考2022-06-06

