C/C++中参数传递的一点点理解

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

以C/C++中交换两个变量的值为例子

最近重新学习数据结构,因为大多数都是以C语言讲解的,我就又捡C语言回来看了一下,发现对指针的理解还是有点没到位,就不停的查例子,请教别人验证自己的理解后,姑且觉得差不多了,就来写个小总结,当我的第一篇博客吧。

写的不好,不对的地方还多请各位大哥指正!!!

…分割线…

C/C++语言中函数参数传递的三种方式

  1. 值传递
    所谓值传递,就是说形参只是复制了实参的值,改变形参的值,并不会影响到实参本身。从函数调用的方面来说,值传递是单向的,
    即实参–>形参,只能传入参数的值。
    形参和实参处于不同的地址空间,所以对形参的操作,不会影响实参。

  2. 指针传递
    指针,存放的是一个地址。当形参为指向实参地址的指针时,调用函数时,传入的就是实参的地址,相当于操作实参本身。

  3. 引用传递
    形参为实参的引用时,形参可看作实参的另外一个名字,也就是说此时形参和实参其实就是同一个东西,对形参的操作就是操作实参本身

这里只粗略介绍一下三种参数传递方式,若要了解从占用内存资源、效率等角度的更详细的解释请查看资料

这里就设 int a=5,b=3

x,y就是形参
a,b就是实参
即定义a,b两个变量,并分别初始化为5和3。
这里姑且认为已经在内存中开辟了a,b两块空间,并再两个空间中分别存放了5和3。

  1. 值传递型
#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的值并没有改变

  1. 指针型
#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指针所指向的地址里面存放的值改变,从而达到交换的目的。(个人认为这样好理解一点)

在这里插入图片描述

  1. 引用型
#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完全是同一个东西,就像一个同学,有身份证上的名字,也有别名。

以上就是本菜鸟的大致理解了,若有不足之处,我再次在这里恳请大家指正!!!

求生欲爆炸!!!
学无止境!!!

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值