一、值传递和址传递的C程序代码
为了说清“值传递”和“址传递”之间的区别,大家先看一段C程序代码,如下:
上述C程序代码非常简单:在C程序的main函数中定义了两个整型变量para1与para2,初始值分别是1和2;还有一个指针变量pInt,初始值是变量para2的地址。
在C程序的main函数中,先调用了自定义函数ValueTrans,并且把变量para1作为参数。在自定义函数ValueTrans中,将变量para1重新赋值为11。在调用完函数ValueTrans后输出变量para1的值,看看是多少;
在C程序的main函数中,再次调用了自定义函数AddrTrans,并且把指针pInt作为参数。在自定义函数AddrTrans中,将指针pInt指向的值重新赋值为22。在调用完函数AddrTrans后输出变量para2的值,看看是多少;
现在大家看看这段C程序的运行结果:
惊不惊喜?意不意外?
二、值传递和址传递的解释
现在大家来解释下上述C程序代码为何是这么个运行结果。
1、值传递
上述C程序代码调用函数ValueTrans,把变量para1作为参数,注意就是把变量para1的值1作为参数。
在具体执行函数ValueTrans时,系统自己默默地、悄悄地在某一个地方新建了一个也叫作para1的整型变量。这个整型变量para1可不是C程序代码main函数中的那个para1.大家可以把main函数中的para1变量看做是main_para1,把函数ValueTrans中的para1看做是ValueTrans_para1.那么在函数ValueTrans中其实是把11赋值给了变量ValueTrans_para1,至于变量main_para1嘛,纹丝不动!
所以在C程序main函数中,最后变量para1的值还是1.
2、址传递
上述C程序代码调用函数AddrTrans,把指针pInt作为参数,注意此时就是把变量para2的地址作为参数,这就有意思啦!
在具体执行函数AddrTrans时,系统自己同样地、悄悄地在某一个地方新建了一个也叫作pInt的指针变量。但是这个指针变量pInt的值就是main函数中的那个pInt的值.换句话说,两个指针变量pInt同时指向了C程序中main函数的变量para2。那么在函数AddrTrans中把22赋值给了指针pInt指向的值,其实也就改变了main函数中的变量para2的值,太神奇了!这就是C语言指针的魅力所在!
所以在C程序main函数中,最后变量para2的值就变成了22.
上述是C语言编程中自定义函数时要注意的一个地方。你明白了吗?