函数参数传递
|
输出:
|
对于第2,3个输出,很多人都能理解,但对第1个输出为什么不同,很多人还没有理解,认为是函数指针作为参数,进行地址传递,&arr也应该是一样的,这样想是因为对函数参数传递的实质还没有认识清楚。
不论是指传递还是地址传递,机制都是一样的,形参接收到实参传递过来的值进行使用。
当为值传递时:
实参a ----> 形参b: b接受了a值,对b的修改,不会影响到a。
当为地址传递时:
实参*a ---> 形参*b:b接受了a的值,此时a,b两个指针变量指向同一内存单元。对b的修改,不会影响到a,但对b指向的内存单元的修改,会导致a指向的内存单元也发生变化(因二者指向同一个内存单元)。
地址传递误区:有人认为地址传递时,b跟a就完全一样了,使用b就是在使用a(在C++的确有这样的机制,即引用),其实不然,在C中并没有引用机制,变量a在调用的函数域内不可见,需要分配一个变量b来接受a传过来的参数,然后使用b,正是这个误区导致很多人对上述例子的输出不解。
如果还对谭浩强版C语言书上一个例子(交换两个变量的值)有印象但还没有理解的,可以再回想一下。
|
总而言之,值传递与地址传递仅仅是传递的变量类型不同,前者传递普通的变量,后者传递指针变量,而其传递机制是一样的。