C语言函数篇(二)函数参数基础设计

形参实现一种数据传入的接口 ,由 实参 拷贝给 形参.

 

拷贝!!!!!!!!!!!

 

例1:
        void func(int tmp){         //意图是实现传进来的参数 +1
            tmp++;
        }

        int mian(){
            int a = 10;
            func(a);
            printf("%d\n",a);       //输出结果还是 10, 并没有实现我们需要的功能
        }
  解析:参数传递是拷贝的概念. 
    由于函数设计的时候, 形参是 int tmp, 执行的动作是将 a 的值 拷贝成 tmp, 传递后
    tmp = 10,  -->  tmp++;  -->  tmp = 11
       因为tmp 是由 a 拷贝出来的,是副本,改动副本并不会影响 a 数据本身,所以 a 的值并不会发生改变.

 

需求:我们确确实实想通过参数传递,来改变实参的内容.
例2:
   void func2(int *tmp){
     (*tmp)++;
   }

   int main(){
       a = 10;
       func2(&a);
       printf("%d\n",a);   //a = 11;
   }
  解析:同样是拷贝,为什么func2 的设计让实参发生了改变?      
    因为 func2 拷贝的是 a 的地址, 把 a 的地址拷贝给 tmp ,这时候 *tmp 指向的也是 int a 这个空间
    在操作 *tmp 的时候,就是直接对这个空间内的数据进行改变,所以让 a 的值发生了改变

 

func1 是 值传递
func2 是 地址传递

 

值传递地址传递 本身不具备 某种特定的标签 在参数传递的过程 只有拷贝两个字 .
而拷贝什么东西 ,其实是由我们人为设计的.
 
拷贝 数值本身 ,就是创建数值副本,不会影响到原始数值,称作 值传递
拷贝 空间地址, 就是将 指针A 拷贝成 指针B, 指针B指向的空间是和指针A指向的空间是一样的,因为指针B是指针A的副本, 既然指针B能够操作这个空间,那自然能够改变这个空间里面的内容.

 

总结:
值传递:    int func1(int tmp){}    在保护原始数据的时候用值传递  缺点:拷贝空间本身,而非地址,创建副本耗费资源,不灵活
 
地址传递: int func2(int *tmp){}     好处:传递参数灵活, 拷贝的是指针,拷贝内容少,指针只有 int大小 .
 
空间传递: C语言函数篇(三)函数参数高级设计

 

posted @ 2018-12-07 08:36  kmist  阅读(427)  评论(0编辑  收藏  举报