漫谈:C语言 值传递 函数参数 指针

        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里面的地址代表的内存,其实就是调用参数a
    x=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异常。

(这里是结束)

你可能感兴趣的:(设计,抱怨与漫谈,软件开发,c语言,数据结构,开发语言)