Javaな日々

NO JAVA, NO LIFE.

Java 脳な人間が C/C++ を扱う時の注意

ICPC という大学対象のプログラミングコンテストを知って,競技プログラミング用に C++ でもはじめるかーと勉強していたらハマった.

この仕様になかなか慣れないので,ICPC に出る時は主のパッケージをまとめて Java で出ようかなぁと思う.
(Java API Doc は試合の中で読んでもいいらしい.)

void func(int x[]){
    ;
}

int main(){
    int array[5] = {0};
    func(array);

    return 0;
}

引数で配列を渡そうと,C/C++ でこのようなプログラムを書いた時,実は func 関数の中で x はポインタ変数となる.従って,func 関数の中で配列を操作すれば main 関数の配列の値が直接操作されてしまう.
(Java であれば func 関数の中で x は,渡された配列のコピーである.)

引数の挙動として "func(int n)" などと書いたときは,引数で渡された変数のコピーが n となる.配列の場合はこのような挙動になる.

C/C++ において,以下の書き方はすべて同義らしい.

int func(int x[5]);
int func(int x[]);
int func(int *x);

従って,C/C++ で配列を操作する関数の引数を書くときは,明示的にポインタを示した方が分かりやすくて良いのかもしれない.

void func(int *x){
    ;
}

int main(){
    int array[5] = {0};
    func(array);

    return 0;
}

C++ を使うなら,配列ではなく Vector を使うのが一般的なようです.

// そういえば C 言語の講義で文字列を char の配列で実装したときに,「配列名はアドレスを返すから scanf で文字列を取得する時は引数に & 演算子がいらない」と習っていた….