关于指针交换的操作

本文探讨了C语言中通过指针交换两个值的几种方法,包括直接交换指针、交换指针所指值等。重点分析了在不同情况下,交换操作对函数外部变量的影响,强调了局部作用域与地址交换的关系,并引用了相关文献说明取址符&的重要性。

关于指针交换的操作

最近重新研究了关于如何通过指针来交换两个值,以及如何交换指针的问题,有了小收获。先上几个函数:


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;
}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值