当前位置:C++技术网 > 资讯 > 面试题:9 解析:下面哪个函数实现两个数的交换--指针与引用的理解

面试题:9 解析:下面哪个函数实现两个数的交换--指针与引用的理解

更新时间:2016-05-17 22:30:25浏览次数:1+次

先看看完整的测试程序:
#include "iostream"
#include "windows.h"

using namespace std;

/*
void swap(int p,int q)
{
	int temp;
	temp=p;
	p=q;
	q=temp;
}*/

void swap2(int *p,int *q)
{
	int *temp;
	temp=(int *)malloc(10*sizeof(int));//新添加的代码
	*temp=*p;
	*p=*q;
	*q=*temp;
}

void swap3(int *p,int *q)
{
	int *temp;
	temp=p;
	p=q;
	q=temp;
}

void swap4(int &p, int &q)
{
	int temp;
	temp=p;
	p=q;
	q=temp;
}

void swap5(int *p,int *q)
{
	int temp;
	temp=*p;
	*p=*q;
	*q=temp;
}

int main()
{
	int a=1,b=2;
	int a1=3,b1=4;
	int a2=5,b2=6;
	int a3=7,b3=8;

	//swap(a,b);
	swap2(&a1,&b1);
	swap3(&a2,&b2);
	swap4(a3,b3);
	swap5(&a,&b);

	cout<<a<<" "<<b<<endl;
	cout<<a1<<" "<<b1<<endl;
	cout<<a2<<" "<<b2<<endl;
	cout<<a3<<" "<<b3<<endl;

	system("pause");
	return 0;
}
运行结果:

可以看到,只有swap3不能实现交换。对比《面试题:下面哪个函数实现两个数的交换——指针与引用的理解》中的代码,我们就是在swap2函数里面加了一句代码——改代码保证了该函数程序能够正常运行,没有它的话就不能运行程序(VS编译器下)。为什么?
在swap2函数中,我们首先是定义了一个指针变量,但是并没有给它分配内存。*temp=*p;不是指向而是拷贝!也就是把*p所指向的内存的值拷贝到*temp指向的值。可temp并没有分配内存啊,为什么能拷贝值?编译器执行拷贝的时候,就给temp分配一个随机的内存地址让它存值。函数结束后,该随机值并不会被收回!会造成内存泄漏!
对于VS编译器而言,一旦运行程序就会出错!跳出下面的错误:

因此,我们给这个指针变量分配内存:
temp=(int *)malloc(10*sizeof(int));
在这里说一句,对于C/C++语言,由于指针泄露而使得程序不能运行。因此,要注意指针的问题!尤其是在数据结构中,像链表等,对指针的运用太多了,因此也容易出错。大家要注意这个指针内存泄漏问题!
而对于swap3函数而言,交换的只是指针内存,而不是指针内存所指向的值,而swap3函数交换的只是指针内存,对于内存里的值并没有交换。相当于换汤不换药!因此,不能实现值的交换!而最后两个。一个是C++特有的引用!一个是引入中间变量来交换变量!两种都是能够实现交换的!