关于地址的交换实现,我们要使用指针+引用的方式进行,例如:
#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
,使得函数内部的操作能够直接影响到传入的原始指针变量,从而实现指针地址的交换等对指针变量本身进行的操作。
以上就是关于地址交换的简单阐述,如有不当还请指出~