zoukankan      html  css  js  c++  java
  • C/C#/java诡异的参数传递及其解释

    先看下下面的C语言代码

    #include <stdio.h>
    
    void s(char *b){
        printf("%s\n",b);
        b="aaaa";
        printf("%s\n",b);
    }
    int main(){
        char *a="hello";
        s(a);
        printf("%s\n",a);
    }

    我的第一印象输出应改为

    hello

    aaaa

    aaaa

    但是这错了。

     

    实际输出为

    hello

    aaaa

    hello

    是不是很诡异?
     
    实际上想一想。
    C语言参数传递的时候实际上是传值(指针也是传递指针的值),调用s(a)的时候,栈开辟一个参数区,将a的指针值传递过去。
    当执行b="aaaa";语句的时候, 会将 参数区域的那个b指针值改变成"aaaa"的地址,但是 a的值是不会变的,所以main函数执行printf("%s\n",a);的时候会打印原先的值。
     
    相似的原理,再来看看java代码。
     
    public void extractXPS(StringWriter sw) {
    
        sw=new StringWriter();
        sw.write("Hello World");
    }
    
    void m(){
        StringWriter sw=new StringWriter();
      System.out.println(sw.toString());        
    }

      请问执行方法m(),会产生什么样的输出?

     结果只会输出"",就是说不会输出"Hello World"。

      在java和C#中,对象参数实际传递的是一个引用(=指针),可以修改,但是若重新指向其他对象,跳出该方法后,对原先的调用者内的原对象没有影响。

     
  • 相关阅读:
    基金进阶
    gpgj-19.高级课总结
    (10)大类资产配置一升级版股债平衡
    13.高速公路行业
    16.投资法总结以及类集团公司介绍
    08.零售类公司分析•上
    在Ubuntu 12.04系统中安装配置OpenCV 2.4.3的方法
    一台电脑上含有多个ubuntu系统的卸载方法
    Linux命令每日一个
    Java UDP实现聊天功能代码
  • 原文地址:https://www.cnblogs.com/stonehat/p/2465037.html
Copyright © 2011-2022 走看看