关于指针交换的操作
最近重新研究了关于如何通过指针来交换两个值,以及如何交换指针的问题,有了小收获。先上几个函数:
void swap1(int** p1, int** p2) {//交换指针
int* temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void swap2(int* p1, int* p2)
{//函数内交换指针,但无法改变函数外的地址
int* temp;
temp = p1;
p1 = p2;
p2 = temp;
}
void swap3(int* p1, int* p2) {//交换指针指向的值
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void swap4(int& p1, int& p2)
{//不加运用无法改变外边的值,加取地址符,类似交换指针
int temp;
temp = p1;
p1 = p2;
p2 = temp;
}
-
swap1:交换指针
用指针指向指针*pointer_1,*pointer_2,以交换 *pointer_1,*pointer_2。

-
swap2:
函数内交换指针,但无法改变函数外的地址,原因参考一下博客的内容:解惑——用指针交换两个数字时所犯的错误

博客原话:在swap1区域内,确实发生了交换。但是需要注意到swap1过程发生在栈当中,也就是局部作用域,此时交换地址相当于把地址当做普通的变量进行交换,一但局部作用域结束,此时在main作用域内,变量a的地址仍然是ox887799,b的地址0x888800.所以没有发生交换。在java当中,这就相当于一个方法接收一作整形变量作为形参,在该方法内对该形参所做的修改不会影响到实参值。 -
swap3:
仅交换指针指向的值
-
swap4:
不加取地址符,输出不改变

加取地址,类似交换指针指向的变量,改变函数外的值

参考文献:引用&和取地址&的区别 -
运行结果:

void swap1(int** p1, int** p2) {//交换指针
int* temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void swap2(int* p1, int* p2)
{//函数内交换指针,但无法改变函数外的地址
int* temp;
temp = p1;
p1 = p2;
p2 = temp;
}
void swap3(int* p1, int* p2) {//交换指针指向的值
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void swap4(int& p1, int& p2)
{//不加运用无法改变外边的值,加取地址符,类似交换指针
int temp;
temp = p1;
p1 = p2;
p2 = temp;
}
int main() {
int a = 5, b = 6;
int* pointer_1, * pointer_2;
pointer_1 = &a;
pointer_2 = &b;
cout << "before swap:"<<endl;
printf("*pointer_1=%d,*pointer_2=%d\n",*pointer_1,*pointer_2);
printf("pointer_1=%p,pointer_2=%p\n\n", pointer_1, pointer_2);
cout << "官方swap:" << endl;
swap(pointer_1, pointer_2);
printf("*pointer_1=%d,*pointer_2=%d\n", *pointer_1, *pointer_2);
printf("pointer_1=%p,pointer_2=%p\n\n", pointer_1, pointer_2);
cout << "swap1:" << endl;
swap1(&pointer_1, &pointer_2);
printf("*pointer_1=%d,*pointer_2=%d\n", *pointer_1, *pointer_2);
printf("pointer_1=%p,pointer_2=%p\n\n", pointer_1, pointer_2);
cout << "swap2:" << endl;
swap2(pointer_1, pointer_2);
printf("*pointer_1=%d,*pointer_2=%d\n", *pointer_1, *pointer_2);
printf("pointer_1=%p,pointer_2=%p\n\n", pointer_1, pointer_2);
cout << "swap3:" << endl;
swap3(pointer_1, pointer_2);
printf("*pointer_1=%d,*pointer_2=%d\n", *pointer_1, *pointer_2);
printf("pointer_1=%p,pointer_2=%p\n\n", pointer_1, pointer_2);
cout << "swap4:" << endl;
swap4(a, b);
//printf("*pointer_1=%d,*pointer_2=%d\n", *pointer_1, *pointer_2);
printf("a=%p,b=%p\n\n", a, b);
return 0;
}
本文探讨了C语言中通过指针交换两个值的几种方法,包括直接交换指针、交换指针所指值等。重点分析了在不同情况下,交换操作对函数外部变量的影响,强调了局部作用域与地址交换的关系,并引用了相关文献说明取址符&的重要性。
1305





