C/C#/javaの奇妙なパラメータ伝達とその解釈

2424 ワード

まず、次のC言語コードを見てみましょう.
#include <stdio.h>



void s(char *b){

    printf("%s
",b); b="aaaa"; printf("%s
",b); } int main(){ char *a="hello"; s(a); printf("%s
",a); }

私の第一印象の出力は
hello
aaaa
aaaa
しかし、これは間違っています.
 

実際の出力は
 
hello
aaaa
hello
変じゃないの?
 
実際に考えてみる.
C言語パラメータが伝達されるときは実際には伝達値(ポインタも伝達ポインタの値)であり,s(a)が呼び出されるとスタックはパラメータ領域を開き,aのポインタ値を伝達する.
b=「aaaa」を実行する場合.文の場合、パラメータ領域のbポインタ値を「aaaa」のアドレスに変更しますが、aの値は変わりませんのでmain関数が実行されます
printf(
"
%s
"
,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#では、オブジェクトパラメータが実際に渡される参照(=ポインタ)は変更できますが、他のオブジェクトを再び指すと、このメソッドをスキップした後、元の呼び出し元のオブジェクトには影響しません.