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

 

 

posted @   stonehat  阅读(467)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
点击右上角即可分享
微信分享提示