赞
踩
C语言中交换两个变量的值可以在主函数中直接实现,也可以通过子函数来实现。下面我们介绍用子函数实现的情况。
1.将两个变量的值作为实参直接传递,在子函数内部定义一个普通变量来对两个形参进行交换,并分别在子函数和主函数中打印。
- #include <stdio.h>
-
- void Swap(int a,int b)
- {
- int tmp = a;
- a = b;
- b = tmp;
- printf("a=%d,b=%d\n",a,b);
- }
-
- int main()
- {
- int a = 5;
- int b = 10;
- printf("a=%d,b=%d\n",a,b);
- Swap(a,b);
- printf("a=%d,b=%d\n",a,b);
-
- return 0;
- }
下面是程序的运行结果:
从程序的运行结果我们可以看出,在子函数内部两个形参是交换成功了的,但是在主函数中却没有。那是为什么呢?我们进入函数内部来看下。
下面是主函数中a和b的地址及值:
下面是子函数中a和b的地址及值:
可以看出主函数和子函数中a和b的地址不相同,即说明了两个函数中的变量不是同一个,仅仅是同名而已。这说明了两个形参已交换成功,但并未传递给实参,两个实参的值并未发生改变。
2.第一种方法中两个实参并未发生改变,因为其地址并未传递给形参。接下来我们把实参的地址传递给形参,并且定义一个指针变量来对两个形参进行交换,并分别在子函数和主函数中打印。
- #include <stdio.h>
-
- void Swap(int *p1,int *p2)
- {
- int *tmp = p1;
- p1 = p2;
- p2 = tmp;
- printf("a=%d,b=%d\n",*p1,*p2);
- }
-
- int main()
- {
- int a = 5;
- int b = 10;
- printf("a=%d,b=%d\n",a,b);
- Swap(&a,&b);
- printf("a=%d,b=%d\n",a,b);
-
- return 0;
- }
下面是程序的运行结果:
可以看出结果还是同样错误。我们进行测试。
下面是主函数中a和b的地址及值:
下面是子函数中a,b,p1,p2的地址及值:
下面是返回到主函数中四个变量的地址及值:
以上测试结果可以说明主函数在给子函数传参时,传的是主函数中的两个变量的地址,但是在子函数中只是把形参p1和p2所指向的变量的地址进行交换,开始p1指向a,p2指向b,交换之后,p1指向b,p2指向a,没有实质性的将实参a,b的值交换。然后返回到主函数中,a和b依然是原来的值,没有交换。
3.下面在子函数中将实参值进行交换。
- #include <stdio.h>
-
- void Swap(int *p1,int *p2)
- {
- int *tmp;
- *tmp = *p1;
- *p1 = *p2;
- *p2 = *tmp;
- printf("a=%d,b=%d\n",*p1,*p2);
- }
-
- int main()
- {
- int a = 5;
- int b = 10;
- printf("a=%d,b=%d\n",a,b);
- Swap(&a,&b);
- printf("a=%d,b=%d\n",a,b);
-
- return 0;
- }
以上方法看似没有错误,但是在运行时程序却会崩溃:
上边显示,变量tmp正在被使用却没有被初始化。这种没有被初始化的指针称为野指针,也叫悬挂指针。野指针是没有访问权限的地址(指针)。没有访问权限,形参不能正常交换,所以程序崩溃。
4.下面才是正确的写法。
- #include <stdio.h>
-
- void Swap(int *p1,int *p2)
- {
- int tmp;
- tmp = *p1;
- *p1 = *p2;
- *p2 = tmp;
- printf("a=%d,b=%d\n",*p1,*p2);
- }
-
- int main()
- {
- int a = 5;
- int b = 10;
- printf("a=%d,b=%d\n",a,b);
- Swap(&a,&b);
- printf("a=%d,b=%d\n",a,b);
-
- return 0;
- }
由此可以总结出学习指针的一个重要知识点:一个函数的改变要影响另一个函数,两个条件:1.传指针;2.解引用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。