C语言有三种传参方式,传值、传引用、传地址,但是传引用和传地址本质也是值传递。
有几篇讲解的很好,http://blog.csdn.net/wenhao_ir/article/details/51611388
https://www.nowcoder.com/questionTerminal/b296e9e1c40542ec8677c1e452b6b576
http://blog.csdn.net/azhexg/article/details/9311933
下面为了区别,我们先这么称呼各种访问方式。
在我所做的毕设内容中,这三种方式对 对象的内外层访问都有影响,所以特来深入探讨下。
1.单纯传值:值传递是传递了原有对象的一个副本,调用函数可以改变副本的值,但是对原有对象没有任何影响
(1)外层
比如:Exchg1(a,b)
int x=a;//←
int y=b;//←注意这里,这两行是调用子函数时的隐含操作
所以在外层其实是访问了a、b的。
(2)内层
主要是就是对形参x、y的访问,与a、b无关
2.传地址
形式1为:Exchg2(int *px, int *py) { ... }
Exchg2(&a,&b);
(1)外层
隐含操作:px=&a;
py=&b; //将&a,&b的值赋值给了px,py
这样外层只有一个取地址操作,并没有涉及到对a对象本身数据的操作,应该不算是对a、b进行访问了把(?)
(2)内层
对*px,*py的操作应该也就是对a,b变量本身的操作了把(?)
形式2为:Exchg2(int *px, int *py) { ... }
int *a, int *b;
Exchg2(a,b);
(1)外层 操作应该是 px = a,*py = b吧
应该是让两个指针指向同一区域,那这样没算访问了a对象吗?(不算吧?)
(2)内层
对*px,*py的操作应该也就是对a,b变量本身的操作了把?3.传引用
形式为:Exchg3(int &x, int &y) { ... }
Exchg3(a,b); //x,y分别引用了a,b变量
(1)外层
隐含操作: 引用就是起别名
将x、y的名字赋给a、b,应该不算对a、b对象的访问
(2)内层
函数里头操作的其实就是实参a,b本身了