C语言麻拐得很。
什么是变量?变量就是内存里面的一个东西,有值。
什么是“值传递”?C语言函数参数调用都是值传递,就是把变量的值给函数。
这里面一个大坑,就是函数参数究竟是什么?很多初学者对“值传递”、“传地址”很困惑,因为没人给他们解释“函数参数是函数内部定义的变量”,只不过必须在函数调用时给值而已,也就是赋初值。
(注:以下代码为示意,不严格)
int fun(int x)//这里定义了变量x
{x=2;//这里操作变量x,跟函数调用的参数a没有任何关系
}main()
{int a=1;fun(a);//这里复制a的值给x,相当于执行了x=a;当然实际汇编代码是push 1,效果一样的
}
什么是“指针”?内存的每个东西都有“地址”,存放地址的变量称为指针。
如果一个函数参数是指针,函数调用的时候发生了什么?
int fun(int * x)//这里定义了变量x,类型是指针
{*x=2;//这里操作的是变量x里面的地址代表的内存,其实就是调用参数ax=2;//这是一个BUG,2是一个非法地址
}main()
{int a=1;int * b=&a;//为什么加这一句?因为本质上,&a就是生成了一个临时变量,类型为int*,值为a的地址fun(b);//这里复制b的值给x,因为b的值是&a,相当于执行了x=&a;
}
因为我们经常写“fun(&a)”这种代码,就觉得“&”表示了一种不同的传参方式,其实这是误解,这里的“&a”是一个运算,生成了一个临时变量,类型为“int*”,值为a的地址。
这样我们就能理解“只有值传递”这句话了,没有地址传递,地址只是变量的一种类型。
C++里面函数参数可以是“引用”,“引用”是什么?引用其实就是指针的另一种写法(当然严格讲引用和指针还是有不少区别的,但究其本质,就是一个语法糖)。
其它高级语言的“变量”、“对象”、“参考”、“引用”等等是什么?其实还是C语言的变量和指针,因为世界本来如此。包装再漂亮,也解决不了null异常。
(这里是结束)