欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2024年11月22日 11:16:27   作者:ikkkkkkkl  
在C++中,地址交換通常是指通過指針操作改變兩個變量之間的內(nèi)存地址引用,當(dāng)你有兩個指針分別指向兩個變量時,你可以通過某種機制交換這兩個指針的內(nèi)容,使得它們各自指向?qū)Ψ皆瓉淼奈恢?本介紹了關(guān)于C++地址交換的實現(xiàn),需要的朋友可以參考下

關(guān)于地址的交換實現(xiàn),我們要使用指針+引用的方式進行,例如:

#include <iostream>
 
// 定義函數(shù)交換兩個整型指針的地址
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;
}

代碼運行結(jié)果如下:

如果我們把代碼寫成這樣,指針傳遞:

void swapIntPtrAddresses(int* ptr1, int* ptr2) {
    int* temp = ptr1;
    ptr1 = ptr2;
    ptr2 = temp;
}

它不能實現(xiàn)預(yù)期的交換指針地址的效果,原因如下:

在 C++ 中,函數(shù)參數(shù)的傳遞方式分為值傳遞、引用傳遞等。這里 swapIntPtrAddresses 函數(shù)的參數(shù) int* ptr1 和 int* ptr2 采用的是值傳遞方式。

當(dāng)進行值傳遞時,函數(shù)會為形參 ptr1 和 ptr2 分別創(chuàng)建獨立的副本,這些副本初始時的值是來自于實參的值(也就是傳入的指針的值)。

在函數(shù)內(nèi)部:

  • 當(dāng)執(zhí)行 int* temp = ptr1; 時,是將形參 ptr1 的副本的值賦給了臨時指針變量 temp。
  • 接著執(zhí)行 ptr1 = ptr2; 和 ptr2 = temp; 這兩步操作,僅僅是在修改形參 ptr1 和 ptr2 的副本的指向,而不是修改傳入的原始指針變量本身的指向。

也就是說,函數(shù)內(nèi)部對形參的這些操作都局限在函數(shù)內(nèi)部創(chuàng)建的這些副本的范圍內(nèi),一旦函數(shù)執(zhí)行完畢,這些副本就會被銷毀,而原始傳入的指針變量(實參)的值并沒有發(fā)生任何改變。

所以,要想實現(xiàn)交換指針地址的功能,就需要采用引用傳遞的方式來傳遞指針變量,就像前面提到的 void swapIntPtrAddresses(int*& ptr1, int*& ptr2) 這種形式,這樣函數(shù)內(nèi)部就能直接對傳入的原始指針變量進行操作,從而實現(xiàn)真正的指針地址交換。

同理,單單使用引用傳遞也是改變不了地址的,只會改變值內(nèi)存上的值大小。

void swapIntPtrAddresses(int &ptr1, int &ptr2) {
    int temp = ptr1;
    ptr1 = ptr2;
    ptr2 = temp;
}

如果寫成這樣呢?

這樣會報錯。 

int&* ptr1, int&* ptr2這種寫法試圖將引用和指針以一種不符合 C++ 語法規(guī)則的方式組合在一起。

int& 表示一個整型引用類型,它是某個整型變量的別名,本身并不是一個可以再被指向(也就是取地址)的實體。在 C++ 中,引用一旦綁定到一個變量上,就不能再重新綁定到其他變量,而且引用本身并沒有實際的存儲地址(它和所引用的變量共享地址),所以不能對引用進行取地址操作,也就不能有類似 int&* (指向引用的指針)這樣的類型定義。

int* &ptr1, int* &ptr2(正確寫法)

這種寫法表示引用傳遞指針,它在很多場景下用于對指針變量本身進行操作,比如前面提到的交換指針地址等操作。

  • int* 表示一個指向整型的指針類型,即這個變量存儲的是一個整型變量的地址。
  • &ptr1 和 &ptr2 表示對指針變量 ptr1 和 ptr2 進行引用操作,所以 int* &ptr1, int* &ptr2 整體的含義是將指針變量 ptr1 和 ptr2 作為引用傳遞進函數(shù)(也就是把指針變量本身當(dāng)作別名來對待,函數(shù)內(nèi)部可以直接對傳入的指針變量本身進行操作)。

這里通過引用傳遞指針 ptr1 和 ptr2,使得函數(shù)內(nèi)部的操作能夠直接影響到傳入的原始指針變量,從而實現(xiàn)指針地址的交換等對指針變量本身進行的操作。

以上就是關(guān)于C++地址交換的實現(xiàn)的詳細內(nèi)容,更多關(guān)于C++地址交換的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論