• 参数传递问题


    一直没有好好研究C语言参数传递,只是从书上看,知道有传值和传地址两种方式,有时候一知半解真的不行,看似懂了,遇到问题后就乱了手脚,他们内部发生什么变化并不清楚,现在写下来。
    C语言的参数传递有传值和传地址两种方式。
    传值的过程:
    (1)行参与实参各占一个独立的存储空间。
    (2)行参的存储空间是函数被调用时才分配的。调用开始,系统为行参开辟一个临时
    存储区,然后将各实参之值传递给行参,这时行参就得到了实参的值。
    (3)函数返回时,临时存储区也被撤销。
    传值的特点:单向传递,即函数中对行参变量的操作不会影响到调用函数中的实参变量。
    例如:
    #include <stdio.h>

    void change_by_value(int x){
        x=x+10;
    }
    void change_by_address(int *x){
        *x=*x+10;
    }
    void main(){
        int a=3;
        printf("a=%d/n",a);
        change_by_value(a);
        printf("a=%d/n",a);//a的值并没有改变
        change_by_address(&a);
        printf("a=%d/n",a);//
    }
    运行结果:
    3
    3
    13
    传值方式:
    void change_by_value(int x)内部发生的动作应当是当函数被调用时(堆栈调用)
    在堆栈上临时分配了一块区域,调用结束,出栈。
    void change_by_value(int x){
        int _x=x;//拷贝一份传递给临时变量_x
        _x=_x+10;//改变的是_x,不是x
    }
    地址传递方式:参数是地址
    void change_by_address(int *x){
        *x=*x+10;
    }
    实参和行参共享一个存储单元,对行参的操作相应的就改变了实参,此时参数传递是双向的。
    此外,参数的存储位置和变量的存储属性对参数传递也有影响,变量的存储属性有动态变量、静态变量
    外部变量,动态变量有2种,自动(auto)和寄存器(register)变量。

    存储属性

    register

    auto

    static

    extern

    存储位置

    寄存器

    主存

    生存期

    动态生存期

    永久生存期

    作用域

    局部

    局部或全局

    全局


    此外还应注意内存的分配方式,内存分配方式有三种:
    (1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的
    整个运行期间都存在。例如全局变量,static 变量。
    (2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函
    数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集
    中,效率很高,但是分配的内存容量有限。
    (3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意
    多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存
    期由我们决定,使用非常灵活,但问题也最多。

  • 相关阅读:
    mysql5.7.11修改root默认密码
    linux tar文件解压
    用Maven插件生成Mybatis代码/数据库
    java对象与json对象间的相互转换
    json串转对象
    maven web 项目中启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener
    MyBatis多数据源配置(读写分离)
    使用HTML5 Web存储的localStorage和sessionStorage方式
    谷歌浏览器 DEV Tools
    数据库建表原则
  • 原文地址:https://www.cnblogs.com/summer-xwq/p/4161818.html
Copyright © 2020-2023  润新知