真人脱发日记之c/c++与python语言的函数参数传递方式

最近写c语言作业和python作业的时候,发现自己就是个bug制造机,编译不过小能手。哎,这篇文章是我写的最多低级bug的一个反思。
由于水平不够,c/c

c/c++

函数参数三种传递方式

值传递:

#include<stdio.h>
int change(int a,int b)//值传递交换
{
printf("change函数值传递的形参地址空间a:%d\tb:%d\n",&a,&b);
int middle;
middle=a;
a=b;
b=middle;
printf("change函数内的参数值a:%d\tb:%d\n",a,b);
}
int main()
{
int a=1;
int b=2;
printf("main函数内的变量地址a:%d\tb:%d\n",&a,&b);
change(a,b);
printf("main函数内的参数值a:%d\tb:%d",a,b);

}

在这里插入图片描述
我们可以看到change函数内的参数a,b的地址与主函数函数里的a,b的地址不同

1.个体辨析:change函数里的形参a,b应该是一个新的东西也就是说按值传递的时候,程序不是直接更改main中的a和b,而是划分一定内存区域重新复制产生一个a1,b1(a1,b1的值与a,b相等,a1,b1的地址与a,b不同),所以在change函数里面的操作并不会改变main函数中的a,b的值。change函数里的a,b与main函数里的a,b是两组有着相同值不同地址内存空间的不同个体

2.生存时间区别:change函数里a1,b1只能在change函数内作用,当退出change函数后就消失了

指针传递(传递地址)

#include<stdio.h>
#include<stdio.h>
int change(int *a,int *b)//指针传递
{
printf("change函数值传递的形参地址空间a:%d\tb:%d\n",a,b);
int middle;
middle=*a;
*a=*b;
*b=middle;
printf("change函数内的参数值a:%d\tb:%d\n",*a,*b);
}
int main()
{int a=1;
int b=2;
printf("main函数内的变量地址a:%d\tb:%d\n",&a,&b);
change(&a,&b);
printf("main函数内的参数值a:%d\tb:%d",a,b);
}

在这里插入图片描述

根据上文中的值传递,我们可以知道c语言函数形参是创建复制一个副本,形参副本与实参的地址不同,那么如果我们想在函数内改变main中变量的话应该怎么做?
指针给我们提供了很好的帮助,那么根据上文虽然函数形参的地址与实参的地址不同,但是形参与实参的值是相等的,如果我们传入实参的值是我们变量的地址,那么通过已知地址在函数里运用指针不就可以改变变量的值了吗
如上图,所示

要注意的是函数中的a,b只是地址,要改变值一定要用指针*a,*b。

引用传递(c++)

这一点是c++里的知识,要用代码尝试的话,后缀改为.cpp
这个里面有从汇编角度辨析引用与指针的区别博客园
由于c++自学还没到达这里,对引用仅仅停留在会用上面(写的有点尴尬了,😢明明是c++的东西还用c语言来写,着实小白之举,大伙尽量看吧)

#include<stdio.h>
#include<stdio.h>
int change(int&a,int &b)//引用传递交换
{
printf("change函数值传递的形参地址空间a:%d\tb:%d\n",&a,&b);
int middle;
middle=a;
a=b;
b=middle;
printf("change函数内的参数值a:%d\tb:%d\n",a,b);
}
int main()
{
int a=1;
int b=2;
printf("main函数内的变量地址a:%d\tb:%d\n",&a,&b);
change(a,b);
printf("main函数内的参数值a:%d\tb:%d",a,b);

在这里插入图片描述
引用传递在用法上感觉比指针好像方便一些,不需要再函数内部加上*指针

对于c/c++参数传递的一点感悟

1.c语言的函数参数传递主要是使用前两种方法,引用是c++里的东西。
2.我(小白)感觉通过函数改变变量的关键在于地址,一个变量他的地址确定,通过地址来改变变量的值。变量的三大要素:值,地址,类型,类型决定存储变量的空间大小,地址决定存储值的位置。
3.感觉c语言好多东西都不了解,看来要自学数据结构了

分享一篇博客C语言中函数参数传递的三种方式

python函数参数传递

就目前对python的了解,python函数传递与c/c++存在很大的不同,python将数据分为了可变类型,以及不可变类型

可变类型

list,set,dict为引用类型(可变)
对于可变类型,python函数可以再函数内改变,而他们的函数参数传递方式是引用传递

不可变类型

int,float,str,tuple为值类型(不可变)
对于不可变类型,修改变量需要新创建一个对象,形参的标签转而指向新对象,而实参没有变,所以他们的函数参数传递方式相当于值传递

复杂情况(可变不可变混合)

我找到了几篇篇很好的博客,这里就不献丑了1.python函数调用时参数传递方式2.python变量的内存机制

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值