C/C#/javaの奇妙なパラメータ伝達とその解釈
2424 ワード
まず、次のC言語コードを見てみましょう.
私の第一印象の出力は
hello
aaaa
aaaa
しかし、これは間違っています.
実際の出力は
hello
aaaa
hello
変じゃないの?
実際に考えてみる.
C言語パラメータが伝達されるときは実際には伝達値(ポインタも伝達ポインタの値)であり,s(a)が呼び出されるとスタックはパラメータ領域を開き,aのポインタ値を伝達する.
b=「aaaa」を実行する場合.文の場合、パラメータ領域のbポインタ値を「aaaa」のアドレスに変更しますが、aの値は変わりませんのでmain関数が実行されます
printf(
"
%s
"
,a);の場合は元の値が印刷されます.
似たような原理でjavaコードを見てみましょう.
すみません、実行方法m()は、どのような出力が発生しますか?
結果は「」しか出力されません.つまり「Hello World」は出力されません.
Javaと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#では、オブジェクトパラメータが実際に渡される参照(=ポインタ)は変更できますが、他のオブジェクトを再び指すと、このメソッドをスキップした後、元の呼び出し元のオブジェクトには影響しません.