最近写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变量的内存机制