关于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语言编写学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 浅析C语言中的sizeof

    浅析C语言中的sizeof

    sizeof是C/C++中的一个操作符(operator),作用就是返回一个对象或者类型所占的内存字节数。返回值类型为size_t,在头文件stddef.h中定义
    2013-07-07
  • C++实现LeetCode(121.买卖股票的最佳时间)

    C++实现LeetCode(121.买卖股票的最佳时间)

    这篇文章主要介绍了C++实现LeetCode(121.买卖股票的最佳时间),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++中运算符重载的规则语法实例

    C++中运算符重载的规则语法实例

    今天小编就为大家分享一篇关于C++中运算符重载的规则语法实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 使用VS2010创建MFC ActiveX工程项目

    使用VS2010创建MFC ActiveX工程项目

    VS2010开发ActiveX有两种方法,分别是MFC和ATL。MFC开过起来比较简单,但是最终生成的文件比较大,ATL是专门用来开发ActiveX的,但是相对比较难,必须知道很多原理机制和API。咱先从MFC开发ActiveX开始吧。
    2015-06-06
  • 详解C语言内核字符串转换方法

    详解C语言内核字符串转换方法

    在内核开发模式下,初始化字符串也需要调用专用的初始化函数,如下分别初始化ANSI和UNCODE字符串,本文我们就来看看代码是如何实现的
    2022-09-09
  • c语言实现两个值互相交换的函数

    c语言实现两个值互相交换的函数

    本文通过代码给大家介绍c语言实现两个值互相交换的函数,通过实例代码给大家讲解的很详细,具有一定的参考借鉴价值,对c语言两个值互换函数相关知识感兴趣的朋友一起看看吧
    2021-05-05
  • C语言中的自定义类型之结构体与枚举和联合详解

    C语言中的自定义类型之结构体与枚举和联合详解

    今天我们来学习一下自定义类型,自定义类型包括结构体、枚举、联合体,小编觉得挺不错的,现在就分享给大家,也给大家做个参考
    2022-06-06
  • C++实现并行计算的两种方式

    C++实现并行计算的两种方式

    本文介绍了使用C++实现并行计算的两种方式,包括OpenMP和MPI,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • C++中头文件和源文件详细介绍

    C++中头文件和源文件详细介绍

    这篇文章主要介绍了C++中头文件和源文件详细介绍的相关资料,需要的朋友可以参考下
    2017-02-02

最新评论