以C/C++中交换两个变量的值为例子
最近重新学习数据结构,因为大多数都是以C语言讲解的,我就又捡C语言回来看了一下,发现对指针的理解还是有点没到位,就不停的查例子,请教别人验证自己的理解后,姑且觉得差不多了,就来写个小总结,当我的第一篇博客吧。
写的不好,不对的地方还多请各位大哥指正!!!
…分割线…
C/C++语言中函数参数传递的三种方式
-
值传递
所谓值传递,就是说形参只是复制了实参的值,改变形参的值,并不会影响到实参本身。从函数调用的方面来说,值传递是单向的,
即实参–>形参,只能传入参数的值。
形参和实参处于不同的地址空间,所以对形参的操作,不会影响实参。 -
指针传递
指针,存放的是一个地址。当形参为指向实参地址的指针时,调用函数时,传入的就是实参的地址,相当于操作实参本身。 -
引用传递
形参为实参的引用时,形参可看作实参的另外一个名字,也就是说此时形参和实参其实就是同一个东西,对形参的操作就是操作实参本身
这里只粗略介绍一下三种参数传递方式,若要了解从占用内存资源、效率等角度的更详细的解释请查看资料
这里就设 int a=5,b=3
x,y就是形参
a,b就是实参
即定义a,b两个变量,并分别初始化为5和3。
这里姑且认为已经在内存中开辟了a,b两块空间,并再两个空间中分别存放了5和3。
- 值传递型
#include<stdio.h>
void swap(int x, int y) {
int tmp;
tmp = x;
x = y;
y = tmp;
}
void main() {
int a = 5;
int b = 3;
swap(a, b);//直接交换两个整数,但是x,y是局部变量只在swap执行时有效,执行完后就释放了
printf("a=%d,b=%d", a, b);
}
输出结果:

由此可见,a,b 本身的值没有交换成功。

由上图可见,值传递就像是a,b传了分身进去
分身怎么变并不影响本体。
swap函数执行后,a,b的值并没有改变
- 指针型
#include<stdio.h>
void swap(int *x, int *y) {
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}
void main() {
int a = 5;
int b = 3;
swap(&a, &b);
printf("a=%d,b=%d", a, b);
}
输出结果为:

a,b的值交换成功
原来整数5的存放地址就是a这个空间的地址,
原来整数3的存放地址就是b这个空间的地址。
我在这里理解成将x,y指针所指向的地址里面存放的值改变,从而达到交换的目的。(个人认为这样好理解一点)

- 引用型
#include<iostream>
void swap(int& x, int& y) {
int tmp;
tmp = x;
x = y;
y = tmp;
}
void main() {
int a = 5;
int b = 3;
swap(a, b);//直接操作实参本身,即a和x是完全相同的,b和y亦是都是
printf("a=%d,b=%d", a, b);
}
输出结果为:

a,b的值交换成功

这里就是说swap函数里面的x,y其实和a,b完全是同一个东西,就像一个同学,有身份证上的名字,也有别名。
以上就是本菜鸟的大致理解了,若有不足之处,我再次在这里恳请大家指正!!!
求生欲爆炸!!!
学无止境!!!

作者重新学习数据结构时复习C语言,对指针理解不到位,经学习后写总结。介绍了C/C++语言中函数参数传递的三种方式:值传递、指针传递和引用传递,并以交换两个变量的值为例,展示了不同传递方式下变量交换的结果。
3392





