關(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)文章
C語言動態(tài)規(guī)劃點殺dp算法LeetCode炒股習(xí)題案例解析
這篇文章主要介紹為了C語言動態(tài)規(guī)劃點殺dp算法,本文以LeetCode炒股習(xí)題案例來為大家進行詳細解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-02-02Pthread并發(fā)編程之線程基本元素和狀態(tài)的剖析
本篇文章主要給大家介紹pthread并發(fā)編程當(dāng)中關(guān)于線程的基礎(chǔ)概念,并且深入剖析進程的相關(guān)屬性和設(shè)置,以及線程在內(nèi)存當(dāng)中的布局形式,幫助大家深刻理解線程2022-11-11C++實現(xiàn)LeetCode(191.位1的個數(shù))
這篇文章主要介紹了C++實現(xiàn)LeetCode(191.位1的個數(shù)),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08