C++分别用指针和引用实现实数交换函数swap()

前几天上课老师给出了一个课堂作业:请分别用指针和引用来实现两个数的交换。虽然题目比较俗套,但是好久没写过C++程序了,依然很生疏,所以我决定总结一下自己的实现,程序粗糙,风格也混合着C,希望大家给提提建议。

      老师出这个题目的目的无非是想让我们联系一下C++基本功,采用指针的方式是C语言的风格,用指针来存储变量的地址,然后通过取地址的内容,直接对内存所存储的数据进行了操作,而引用则是C++风格,引用相当于对一个变量起了一个别名,正常的名字跟别名指示的是同一块内存地址,这里要注意指针与引用在使用过程的代码。

#include<cstdio>
//#include<iostream>
//tianqiweiqi.com
//using namespace std;

int Ptr_swap(int* pa, int* pb) { //使用指针方式
	int temp;
	temp = *pa;    //将指针指示的内容赋值给中间变量
	*pa = *pb;
	*pb = temp;

	return 0;
}
int Cite_swap(int& ca, int& cb) { //使用 引用方式
	int temp;
	temp = ca;     //因为引用是变量的别名,他们指向相同的内存空间
	ca = cb;       //所以可以直接使用别名来交换
	cb = temp;

	return 0;
}
int main(int args, char* argv[]) {

	//printf("hello ");

	// char *s[] = {"yums","qq","tt"};

	int x = 1;
	int y = 2;
	int* px = &x;
	int* py = &y;

	int Perror = Ptr_swap(px, py);
	// cout<<x<<y<<endl;
	printf("the sort by pointer is:%d %d \n", x, y);

	int& cx = x;
	int& cy = y;

	int Cerror = Cite_swap(cx, cy);
	printf("the sort by cite is:%d %d\n", x, y);

	// printf("%c\n",86);

	return 0;
}

教课书实例:

#include <iostream>
using namespace std;

void swap(int& a, int& b)
{
	if (a == b)
	{
		return;//若两值相等,无需比较,即让函数停止运行
	}
	int temp;
	temp = a;
	a = b;
	b = temp;
}

int main()
{
	int a = 3, b = 4;
	cout << "交换前a=3, b=4" << endl;
	swap(a, b);
	cout << "交换后a=" << a << ", b=" << b << endl;
	system("pause");
	return 0;
}
= > 交换前a = 3, b = 4
交换后a = 4, b = 3
这个函数首先检查两个值是否相等,如果相等则退出函数;如果不相等,则交换这两个值,隐式的return发生在最后一个赋值语句后。

swap传入指针也会交换失败

今天上课就真的长知识了,一直以为自己学得还可以,知识面还算有点广,然而这次就打脸了啊;闲话不多说,直接进入主题;

以前看视频学习的时候就记得过这样一句话,
想要利用函数来交换两个数的值,只能传递指针。
然而我误以为只要传递指针就能交换两个数的值。然而错了。事实证明吧;

先看一下传递数值的情况吧;

#include<stdio.h>
void swap(int x, int y)
{
    int t;
    t = x;
    x = y;
    y = t;
}
int main()
{
    int a, b;
    scanf("%d %d",&a, &b);
    swap(a, b);
    printf("%d %d",a, b);

    return 0 ;
}

这个都知道的,肯定没有交换成功啊。说一下原因吧;
先说一下,每个变量都对应这一个地址,函数中的变量也是这样的。
再回归正题吧。传递a,b,变成了x,y。然后x,y进行了交换,当函数结束的时候,xy变量的内存也会释放掉,所以并没有将交换的值赋给a,b了。所以这个函数并没有达到交换结果。

我觉得用一个程序可以更好的解释;

#include<stdio.h>
void swap(int x, int y)
{
    int t;
    t = x;
    x = y;
    y = t;
    printf("%d %d\n",x, y);
    printf("%d %d\n\n",&x,&y); //x,y的地址
}
int main()
{
    int a, b;
    scanf("%d %d",&a, &b);
    swap(a, b);
    printf("%d %d\n",&a,&b); //a,b的地址
    printf("%d %d\n",a, b);

    return 0 ;
}

应该懂了吧;

再看下一个swap; 
传递的是指针变量;

#include<stdio.h>
void swap(int * x, int * y)
{
    int t;
    t = *x;
    *x = *y;
    *y = t;
}
int main()
{
    int a, b , *pa, *pb;
    scanf("%d %d",&a, &b);
    pa = &a;
    pb = &b;
    swap(pa, pb);
    printf("%d %d\n",a, b);

    return 0 ;
}

这个是交换成功的。还是解释一下吧;
这个例子就是我最前面说的那句话的事实吧;想要利用函数来交换两个数的值,只能传递指针;
比较一下这个例子与上面那个交换失败的不同吧;
他传递的是指针变量,然而为什么就成功了呢?
因为传递的是指针变量,相当于传递的是地址,则再根据swap函数,可以理解位swap函数的交换就是交换传递过来地址中的变量。当函数结束,就意味值交换结束,然而这变量的地址并没有释放,因为这是属于主函数的,只是经过swap函数来处理一下这一地址中的变量。

同样的代码来证明一下吧;

#include<stdio.h>
void swap(int * x, int * y)
{
    int t;
    t = *x;
    *x = *y;
    *y = t;
    printf("%d %d\n",*x, *y);
    printf("%d %d\n\n",x,y); 
}
int main()
{
    int a, b , *pa, *pb;
    scanf("%d %d",&a, &b);
    pa = &a;
    pb = &b;
    swap(pa, pb);
    printf("%d %d\n",&a,&b); 
    printf("%d %d\n",a, b);

    return 0 ;
}

进入正题了。同样传递的是指针然而交换会失败呢?当时真的有点不能理解呢? 
其实后面再一想,确实啊,怎么可能会交换ab的值呢; 
先看一下它是怎么交换的吧?

#include<stdio.h>
void swap(int * x, int * y)
{
    int * t;
    t = x;
    x = y;
    y = t;
}
int main()
{
    int a, b , *pa, *pb;
    scanf("%d %d",&a, &b);
    pa = &a;
    pb = &b;
    swap(pa, pb);
    printf("%d %d\n",a, b);

    return 0 ;
}

这个代码交换的是地址,根本就没有交换ab的值,发现了吧? 
代码证明一下吧;

#include<stdio.h>
void swap(int * x, int * y)
{
    int * t;
    t = x;
    x = y;
    y = t;
    printf("%d %d\n",*x, *y);
    printf("%d %d\n\n",x,y); 
}
int main()
{
    int a, b , *pa, *pb;
    scanf("%d %d",&a, &b);
    pa = &a;
    pb = &b;
    swap(pa, pb);
    printf("%d %d\n",&a,&b); 
    printf("%d %d\n",a, b);

    return 0 ;
}

作者:

喜欢围棋和编程。

 
发布于 分类 编程标签

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注