自学内容网 自学内容网

关于C++地址交换的实现

关于地址的交换实现,我们要使用指针+引用的方式进行,例如:

#include <iostream>

// 定义函数交换两个整型指针的地址
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;

    // 调用函数交换指针地址
    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;
}

代码运行结果如下:

 

如果我们把代码写成这样,指针传递:

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

它不能实现预期的交换指针地址的效果,原因如下:

在 C++ 中,函数参数的传递方式分为值传递、引用传递等。这里 swapIntPtrAddresses 函数的参数 int* ptr1 和 int* ptr2 采用的是值传递方式。

当进行值传递时,函数会为形参 ptr1 和 ptr2 分别创建独立的副本,这些副本初始时的值是来自于实参的值(也就是传入的指针的值)。

在函数内部:

  • 当执行 int* temp = ptr1; 时,是将形参 ptr1 的副本的值赋给了临时指针变量 temp
  • 接着执行 ptr1 = ptr2; 和 ptr2 = temp; 这两步操作,仅仅是在修改形参 ptr1 和 ptr2 的副本的指向,而不是修改传入的原始指针变量本身的指向。

也就是说,函数内部对形参的这些操作都局限在函数内部创建的这些副本的范围内,一旦函数执行完毕,这些副本就会被销毁,而原始传入的指针变量(实参)的值并没有发生任何改变。

所以,要想实现交换指针地址的功能,就需要采用引用传递的方式来传递指针变量,就像前面提到的 void swapIntPtrAddresses(int*& ptr1, int*& ptr2) 这种形式,这样函数内部就能直接对传入的原始指针变量进行操作,从而实现真正的指针地址交换。

同理,单单使用引用传递也是改变不了地址的,只会改变值内存上的值大小。

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

如果写成这样呢?

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

这样会报错。 

int&* ptr1, int&* ptr2这种写法试图将引用和指针以一种不符合 C++ 语法规则的方式组合在一起。

int& 表示一个整型引用类型,它是某个整型变量的别名,本身并不是一个可以再被指向(也就是取地址)的实体。在 C++ 中,引用一旦绑定到一个变量上,就不能再重新绑定到其他变量,而且引用本身并没有实际的存储地址(它和所引用的变量共享地址),所以不能对引用进行取地址操作,也就不能有类似 int&* (指向引用的指针)这样的类型定义。

int* &ptr1, int* &ptr2(正确写法)

这种写法表示引用传递指针,它在很多场景下用于对指针变量本身进行操作,比如前面提到的交换指针地址等操作。

  • int* 表示一个指向整型的指针类型,即这个变量存储的是一个整型变量的地址。
  • &ptr1 和 &ptr2 表示对指针变量 ptr1 和 ptr2 进行引用操作,所以 int* &ptr1, int* &ptr2 整体的含义是将指针变量 ptr1 和 ptr2 作为引用传递进函数(也就是把指针变量本身当作别名来对待,函数内部可以直接对传入的指针变量本身进行操作)。

这里通过引用传递指针 ptr1 和 ptr2,使得函数内部的操作能够直接影响到传入的原始指针变量,从而实现指针地址的交换等对指针变量本身进行的操作。

以上就是关于地址交换的简单阐述,如有不当还请指出~


原文地址:https://blog.csdn.net/ikkkkkkkl/article/details/143923068

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!