C语言笔试题中经常会遇到的题目——交换2个变量的值。这时候大家就要注意了,这个问题虽然简单,但是你要认真审题,看是否让你把这个功能写成函数形式。
(1)如果不需要写成函数形式,那就是以下代码:大学的时候大家应该都学过的,交换C语言中两个变量的值核心是一定要借助一个临时变量:
1 #define _CRT_SECURE_NO_WARNINGS 1 2 #include <stdio.h> 3 int main() { 4 5 int a = 100; 6 int b = 200; 7 int tmp = 0; 8 printf("a=%d b=%d \n", a, b); 9 tmp = a; 10 a = b; 11 b = tmp; 12 printf("a=%d b=%d \n", a, b); 13 return 0; 14 }
结果:
(2)如果题目要求让你写成函数形式,那么你就要注意了,这个是一定很容易出错的问题。
我们先来看下函数函数调用涉及到的知识点:
函数调用的2种方式:
- 传值调用:函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
- 传址调用:传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
先贴上代码:
1 #define _CRT_SECURE_NO_WARNINGS 1 2 #include <stdio.h> 3 4 // !!!!这个才是正确的交换2变量的示例 5 void Swap2(int* pa, int* pb) { 6 int tmp = 0; 7 tmp = *pa; 8 *pa = *pb; 9 *pb = tmp; 10 } 11 12 // void是空,无的意思,就是不需要返回值 13 // !!!!这里的交换方式是错误的,不会交换x,y的值 14 // 当实参传给形参的时候,形参其实是实参的一份临时拷贝,对形参的修改是不会改变实参的 15 void Swap1(int x, int y) { 16 int tmp = 0; 17 tmp = x; 18 x = y; 19 y = tmp; 20 } 21 22 int main() { 23 24 int a = 100; 25 int b = 200; 26 int tmp = 0; 27 printf("a=%d b=%d \n", a, b); 28 // 函数的调用:传值调用 29 printf("错误交换方式 \n"); 30 Swap1(a, b); 31 printf("a=%d b=%d \n", a, b); 32 33 // 知识点回顾 34 int* pa = &a; // pa指针变量 35 *pa = 200; // 解引用操作,修改指针中的内容 36 printf("a = %d\n", a); 37 38 a = 100; 39 b = 200; 40 printf("a=%d b=%d \n", a, b); 41 // 函数的调用:传址调用 42 printf("正确的交换方式 \n"); 43 Swap2(&a, &b); 44 printf("a=%d b=%d \n", a, b); 45 46 return 0; 47 }
结果:
这里有几个知识点需要提点下大家:
- Swap1函数为什么是错误的,首先,Swap1这个函数返回值是空,是空的话那么就意味着你的交换结果是没有返回值的,你交换的只是传递过去的值,并不会影响a,b本身,除非你再设置2个返回值来接收交换的结果。或者用C语言的指针!
- Swap2函数为什么能返回正确的结果,因为它传递过去的不再是值,而是指针,那这样,你对通过 *p 就可以获取到指定 a, b 所在指针空间的值,那就相当于你直接对 a, b 进行操作了,所以就可以交换成功,并且这样函数Swap2也不需要设置返回值。如果大家有学过python的是不是觉得这个有点像 python 的 in-place(原地修改)操作,比如python中 value.sort() 就可以实现对 value 的值从小到大进行排序并且直接作用在 value 上,不需要返回值的接收。
没想到一个简单的交换两个函数的函数会涉及到指针,我把这个拿出来和大家说,因为我觉得这个示例对理解C语言指针有很大的帮助,希望大家有兴趣对C语言指针还不熟悉的话可以亲自去敲下代码,一定会帮你加深理解的~
参考资料:https://www.bilibili.com/video/BV1q54y1q79w?p=10