x是普通形参,y是引用传参,z是指针传参。其实指针传参和普通传参是一样的,都是传递参数的值:把x的值传入Function2(),等于复制一份副本,在Function2()内部也称之为x,这个x无论怎么改,都不会影响外部原先那个x(在复印件上做修改是不会影响原件的);同样,z也是值传递,但这次传递的是z的地址(&z),把地址复印了一份,在main()中z是实值0,但在Function2()中z是main()中z的地址,这里两个z是不同的东西,不过,通过地址可以找到真身,在Function2()中,*z就是main()中的z,所以*z=3就令main()中的z=3。
y是引用传参,直接把main()中y的别名传入Function2(),两处的y是同一个东西,所以在Function2()中对y作修改,都是直接改真身。引用传参比指针传参优越之处,是不用附加*和&这样的特殊符号。在Function2()中,要用*z来指代main()中的z,一旦忘记加*,就出错,但y就是main()中的y,直接多了,也直观得多,不容易错。通过引用得到的名字,只是别名而已,比如Function2(x,y,&z),声明Function2(int x, int& yyy, int* z),在Function2()中,yyy就是main()中的y,无论怎么改,都是同一个对象,但如果是指针,就要多加一个*号,*yyy才是,这样就很容易出错了,基本上,初学者都是死在这种地方。不过,要回避这种错误,也是有办法的,那就是把变量名起好,指针的名字要很清晰地指出是指针,这样看文字就能提醒思维。不习惯起有意义的变量名,这是学生时代学编程最糟糕的坏习惯,很多大陆的编程教材,自己就不注意这点,把学生也教坏。
指针经常把初学者搞晕,就是符号太多,在C++中,建议多用引用,这也是现代高级语言的共同点,不要死守C的指针,本质上虽然是一样的,但表现形式不同,使用的体验也不一样。
[
本帖最后由 TonyDeng 于 2012-6-30 11:38 编辑 ]