1

最近、次の質問をしました:整数配列へのポインターが機能しないのはなぜですか?

提案の 1 つは、変数を指すポインターの代わりに通常の変数を使用することでした。

私は過去に Java でプログラミングしたことがあります。私が正しく理解している場合、Java でこのコードがある場合:

void test(b) {
    b++;
}

void main() {
    int a = 0;
    test(a);
}

その後、a は 0 のままになります。しかし、C で正しく理解した場合、次のコードがあるとします。

void test(b) {
    b++;
}

int main() {
    int a = 0;
    test(a);
    return 0;
}

すると a は 1 になる?

4

4 に答える 4

4

いいえ、c で値を渡すとその値のコピーが作成され、元の変数は変更されません。

これで、その変数のアドレスの値を渡すことができます。関数で、渡されたアドレスが指している場所を調べ、そのアドレスの値を変更すると、元の変数が変更されます。

于 2013-04-01T17:57:37.397 に答える
2

いいえ。C の例では、aは元の値を保持します。C では、すべてのパラメーターが値によって渡されますが、Java では、プリミティブ型のみが値によって渡され、その他はすべて参照によって渡されます。説明した効果を実現するには、コードは次のようになります。

void test(int* b) {
    (*b)++;
}

int main() {
   int a = 0;
   test(&a);
   return 0;
}

ここでtest、ポインタを受け取り、int逆参照 (指定されたアドレスのメモリにある値を取得) し、それを 1 増やしmain()ますa

于 2013-04-01T18:00:54.263 に答える
1

ちょっと待ってください。"C では、引数は値によって関数に渡されますが、他の言語では参照によって変数が渡されます。これは、受け取る関数が値のコピーを取得し、元の変数を変更する直接的な方法がないことを意味します。別の関数から渡された変数を変更する場合、呼び出し元はそのアドレス (変数へのポインター) を渡す必要があります。これは、受け取る関数で逆参照できます。詳細については、ポインターを参照してください。

于 2013-04-01T18:03:14.147 に答える
0

どちらの言語でも、値をコピーして変数を渡します。C では、メモリ位置 (ポインター) を値として渡すことができ、効果的に参照渡しを取得できます。

Java では、参照を渡すことで (実際にメモリ アドレス値を持たなくても) 同じことを行うことができます。ただし、参照によって参照できるのはオブジェクトのみであるため、Java 組み込み型は参照によって渡すことができません。配列は実際には Java のオブジェクトであるため、Java プリミティブの配列であっても、配列を扱う場合は一部のルールをオブジェクトとして解釈する必要があることに注意してください。

于 2013-04-01T18:03:21.213 に答える