zoukankan      html  css  js  c++  java
  • C语言函数篇(二)函数参数基础设计

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

     

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

     

    例1:
            void func(int tmp){         //意图是实现传进来的参数 +1
                tmp++;
            }
    
            int mian(){
                int a = 10;
                func(a);
                printf("%d
    ",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
    ",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语言函数篇(三)函数参数高级设计

     

  • 相关阅读:
    Hyperion Planning 表单数据验证功能实现
    类型别名
    内联函数和constexpr函数
    强制类型转换
    当函数返回值是引用
    左值和右值
    const形参和实参
    const限定符
    auto与decltype
    局部对象
  • 原文地址:https://www.cnblogs.com/kmist/p/10080949.html
Copyright © 2011-2022 走看看