最近学习c语言的过程中被之前的c++习惯所困扰,其中最迷惑的地方在于函数调用时,值的传递方式。
总体要说的传递方式分为三大板块,值传递,指针传递,和引用传递。关于三者的区别在网上也有详细解释,但部分感觉对新手还是比较容易迷糊,所以说下自己更详细的理解。
首先,对C来讲,传递方式只有两种,值传递与指针传递。
引用传递独属于C++,看看以下代码:
void valueTf(int a) //值传递
void pointTf(int* a) //指针传递
void referenceTf(int& a) //引用传递
一、值传递
值传递原理非常简单,即将传递的参数复制一份给形参,对于第一个方法value来讲,将形参a直接与传递的数值相等,比如传递的数值为int b; 那么value的意义即为 int a=b;
二、指针传递
指针传递不过是特殊的值传递,只不过传递的是地址本身,如第二个方法pointTf(int* a),形参为int* a,在传递参数时,不管你传递的是什么,都被视为 int* a=被传递值。也就是说,如果你传递&b,那么a就指向b的地址,如果传递常数 8,a就指向0x08.
以上两种方式在C与C++中有相同表现,但值得注意的是,C++在引用上面两个方法时更加规范,在C中,valueTf(a),valueTf(&a),pointTf(a),
pointTf(&a)都能通过编译,理论上讲,这并没有什么问题,有问题也是程序员的问题。但在C++中,这两种方式被限定,valueTf不能传递地址,pointTf也不能传递非地址。
三、引用传递
此传递方式最容易迷惑人,这是c++的新特性,要理解它首先要知道,c++里有一个怪东西,叫引用,记作 int & a;引用理解为绰号,也就是右值的小名,所以显然引用无法单独存在,
int &a;////显然不行,小名不能单独存在,必须依附于大名.
int b=3;
int &a=b;//正确
理解引用后,引用传递就变得简单,与前面所诉一样,不过是
int&a=b 罢了。当然关于引用本身还有很多能说的,但对于理解这三种传递方式,到这里也就差不多了。
网友评论