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

 更新时间:2024年11月22日 11:16:27   作者:ikkkkkkkl  
在C++中,地址交换通常是指通过指针操作改变两个变量之间的内存地址引用,当你有两个指针分别指向两个变量时,你可以通过某种机制交换这两个指针的内容,使得它们各自指向对方原来的位置,本介绍了关于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;
}

如果写成这样呢?

这样会报错。 

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,使得函数内部的操作能够直接影响到传入的原始指针变量,从而实现指针地址的交换等对指针变量本身进行的操作。

以上就是关于C++地址交换的实现的详细内容,更多关于C++地址交换的资料请关注脚本之家其它相关文章!

相关文章

  • 餐馆点菜系统C语言源代码

    餐馆点菜系统C语言源代码

    这篇文章主要为大家详细介绍了餐馆点菜系统C语言源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • 如何在C++中实现一个正确的时间循环器详解

    如何在C++中实现一个正确的时间循环器详解

    这篇文章主要给大家介绍了关于如何在C++中实现一个正确的时间循环器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • iostream与iostream.h的区别详细解析

    iostream与iostream.h的区别详细解析

    以下是对C++中iostream与iostream.h的区别进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-09-09
  • C语言中输入函数(scanf()、fgets()和gets())的区别详解

    C语言中输入函数(scanf()、fgets()和gets())的区别详解

    这篇文章主要给大家介绍了关于C语言中三种输入函数(scanf()、fgets()和gets())区别的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11
  • C语言实现磁盘映射

    C语言实现磁盘映射

    磁盘映射技术通过将文件映射到内存中,提高了文件操作的效率,本文就来介绍一下C语言实现磁盘映射,感兴趣的可以了解一下
    2024-09-09
  • 利用C++实现双链表基本接口示例代码

    利用C++实现双链表基本接口示例代码

    双链表:在单链表的每个结点中,再设置一个指向其前驱结点的指针域,下面这篇文章主要给大家介绍了关于利用C++实现双链表基本接口的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • C语言中数据在内存如何存储

    C语言中数据在内存如何存储

    本文详细讲解了C语言中数据在内存如何存储,文中通过示例代码介绍的非常详细。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • C++实现MyString的示例代码

    C++实现MyString的示例代码

    本文主要介绍了C++实现MyString的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C++数据结构分析多态的实现与原理及抽象类

    C++数据结构分析多态的实现与原理及抽象类

    继承就是可以直接使用前辈的属性和方法。自然界如果没有继承,那一切都是处于混沌状态。多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作
    2022-02-02
  • C++11 thread多线程编程创建方式

    C++11 thread多线程编程创建方式

    这篇文章主要介绍了C++11 thread多线程编程的相关知识,包括线程的创建方式结束方式及互斥锁的实例代码详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12

最新评论