最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于C++地址交換的實(shí)現(xiàn)

 更新時(shí)間:2024年11月22日 11:16:27   作者:ikkkkkkkl  
在C++中,地址交換通常是指通過(guò)指針操作改變兩個(gè)變量之間的內(nèi)存地址引用,當(dāng)你有兩個(gè)指針?lè)謩e指向兩個(gè)變量時(shí),你可以通過(guò)某種機(jī)制交換這兩個(gè)指針的內(nèi)容,使得它們各自指向?qū)Ψ皆瓉?lái)的位置,本介紹了關(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)

    C語(yǔ)言編寫(xiě)學(xué)生成績(jī)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言編寫(xiě)學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 淺析C語(yǔ)言中的sizeof

    淺析C語(yǔ)言中的sizeof

    sizeof是C/C++中的一個(gè)操作符(operator),作用就是返回一個(gè)對(duì)象或者類(lèi)型所占的內(nèi)存字節(jié)數(shù)。返回值類(lèi)型為size_t,在頭文件stddef.h中定義
    2013-07-07
  • C++實(shí)現(xiàn)LeetCode(121.買(mǎi)賣(mài)股票的最佳時(shí)間)

    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í)例

    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創(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)換方法

    詳解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ù)

    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)合詳解

    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
  • C++實(shí)現(xiàn)并行計(jì)算的兩種方式

    C++實(shí)現(xiàn)并行計(jì)算的兩種方式

    本文介紹了使用C++實(shí)現(xiàn)并行計(jì)算的兩種方式,包括OpenMP和MPI,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • C++中頭文件和源文件詳細(xì)介紹

    C++中頭文件和源文件詳細(xì)介紹

    這篇文章主要介紹了C++中頭文件和源文件詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-02-02

最新評(píng)論

临夏市| 灵武市| 花莲市| 临海市| 怀安县| 汉寿县| 额济纳旗| 苍山县| 巢湖市| 塔河县| 蒙阴县| 惠水县| 隆昌县| 镇原县| 重庆市| 迁安市| 扎囊县| 隆昌县| 红桥区| 黄大仙区| 衡山县| 惠水县| 明星| 澄城县| 昌乐县| 克山县| 洛南县| 淮滨县| 紫云| 齐河县| 仁寿县| 沂南县| 沿河| 蓝田县| 临泽县| 长沙县| 通海县| 石家庄市| 锦州市| 尼勒克县| 湖口县|