代码如下
本次3.0版本中测试部分较多,还请多一点耐心呀!
在此之前,先来回看一下之前交换两数的1.0版本:【C语言】利用指针变量作函数参数,交换两数
这是2.0版本:【C语言】利用指针变量作函数形参,交换两数(2.0版本 √)
其实两个版本的区别之处,很小,只是在Swap()函数中做了些许处理。
第三个版本亦是如此,但是该版本无法实现交换两数 的功能,这里单独列出,是为了加深对指针的理解。代码如下:
#include <stdio.h>
void Swap(int *x,int *y);
int main(){
int a,b;
printf("Please enter a,b: ");
scanf("%d,%d",&a,&b);
printf("\n");
printf("Before Swap: a=%d,b=%d\n",a,b);
printf("\n");
Swap(&a,&b);
printf("After Swap: a=%d,b=%d\n",a,b);
return 0;
}
void Swap(int *x,int *y){
int *t;
t=x;
x=y;
y=t;
}
测试输出
这一版本,做出的区别还是挺大的。虽然还是在函数体内,int *t 还是没有变化。可是交换的语句却发生了变化,最后却不能实现交换两数的功能,这是为何?
简析
我们对程序做出一些改变,增加一些打印输出语句,看看程序到底做了什么,Swap()函数内部到底干了啥嘞?
#include <stdio.h>
void Swap(int *x,int *y);
int main(){
int a,b;
printf("Please enter a,b: ");
scanf("%d,%d",&a,&b);
printf("\n");
printf("Before Swap: a=%d,b=%d\n",a,b);
printf("\n");
Swap(&a,&b);
printf("After Swap: a=%d,b=%d\n",a,b);
return 0;
}
void Swap(int *x,int *y){
printf("测试输出_01:&x is %p\n",x);
printf("测试输出_02: &y is %p\n",y);
printf("\n");
int *t;
t=x;
x=y;
y=t;
printf("测试输出_03:&x is %p\n",x);
printf("测试输出_04: &y is %p\n",y);
printf("\n");
}
上面的程序测试如下:
注意看绿色框框里的,可以看到的确是实现了“交换”,因为地址都交换了!但那是交换的什么地址呢?在我看来,应当是所谓形参的,可以看到主要的交换语句是 t=x; x=y; y=t; 我们知道,x和y是分别指向两个整型数据的指针变量。不是很好理解的话,接下来再对程序做一点改变,继续输出内容。
改变如下:
更改的(新增)测试输出语句依然在Swap()函数中,为了程序完整所以也把main()函数带上了。
#include <stdio.h>
void Swap(int *x,int *y);
int main(){
int a,b;
printf("Please enter a,b: ");
scanf("%d,%d",&a,&b);
printf("\n");
printf("Before Swap: a=%d,b=%d\n",a,b);
printf("\n");
Swap(&a,&b);
printf("After Swap: a=%d,b=%d\n",a,b);
return 0;
}
void Swap(int *x,int *y){
printf("初始:\n");
printf("测试输出_01:&x is %p , , , x is %d\n",x,*x);
printf("测试输出_02: &y is %p , , , y is %d\n",y,*y);
printf("\n");
int *t;
t=x;
x=y;
y=t;
printf("而后:\n");
printf("测试输出_03:&x is %p , , , x is %d\n",x,*x);
printf("测试输出_04: &y is %p , , , y is %d\n",y,*y);
printf("\n");
}
输出如下:
所以说,“交换”确实是“实现”(×××)了,但仅仅是在Swap()函数内部,当执行完Swap()函数之后,变量将会“销毁”,并不会传回去,我认为 这就和1.0版本最初的那个引例道理一样,那么我们再来回看一下引例。 引例的程序:(直接加一些测试 输出语句看看)请略过注释部分,直接看下面的正式程序:
#include <stdio.h>
void Swap(int x,int y);
int main(){
int a,b;
printf("Please enter a,b: ");
scanf("%d,%d",&a,&b);
printf("\n");
printf("Before Swap:a=%d,b=%d\n",a,b); printf("\n");
Swap(a,b);
printf("After Swap:a=%d,b=%d\n",a,b);
return 0;
}
void Swap(int x,int y){
printf("初始:-------------\n");
printf("x=%d, y=%d\n",x,y);
printf("\n");
int t;
t=x;
x=y;
y=t;
printf("而后:----------------\n");
printf("x=%d, y=%d\n",x,y);
printf("\n");
}
输出为:
所以说,最简单的这个例子,应该可以对上面为何不能实现交换两数,有所理解吧!
有任何说的不准确或者不完美的地方,欢迎各位道友不吝指正呀!!!
|