23

私はCが初めてで、疑問があります。

C 関数はその引数のローカル コピーを作成するため、次のコードが期待どおりに機能する理由を知りたいです。

void function(int array[]){

    array[0] = 4;
    array[1] = 5;
    array[2] = 6;   
}

int main(){

    int array[] = {1,2,3};

    function(array);

    printf("%d %d %d",array[0],array[1],array[2]);

    return 0;
}

ライン出力は 4 5 6 です。

以下が機能しないのに、なぜこれが機能するのですか?

void function(int integer){

    integer = 2;
}

int main(){

    int integer = 1;

    function(integer);

    printf("%d",integer);

    return 0;
}

この場合、出力は 1 です。

ショートバージョン:関数が配列として渡された場合、親変数の値を変更できるのはなぜですか?

皆さん、ありがとうございました!

4

5 に答える 5

3

関数に渡された配列はポインタに変換されます。関数への引数としてポインターを渡すときは、メモリ内の変数のアドレスを指定するだけです。したがって、配列のセルの値を変更する場合は、関数に指定されたアドレスの下の値を編集します。

単純な整数を関数に渡すと、整数がスタックにコピーされます。関数内で整数を変更すると、元の整数ではなく、整数のコピーが変更されます。

C のさまざまな種類のメモリのリマインダー

C では、次の 3 種類のメモリを使用できます。

  • ローカル変数と関数呼び出しに使用されるスタック: main() で変数を作成するときは、スタックを使用して変数を格納し、関数が呼び出されると、メソッドに渡されたパラメーターがスタックに登録されます。関数を終了するとき、これらのパラメーターを「ポップ」して元の状態に戻し、関数の呼び出し前に使用された変数を使用します。(逸話: スタック オーバーフローとは、スタックをハックして、関数内の以前の変数をパラメーターとして渡さずに使用することです)
  • 動的に割り当てられたメモリに対応するヒープ: 大量のデータが必要な場合、スタックが数メガバイトに制限されているため、このヒープを使用します。
  • プログラム命令が格納されているコード

関数によって渡されるこの配列の場合、これはポインター (他の変数へのアドレス) であり、スタックに格納されます。関数を呼び出すと、ポインターがスタックにコピーされます。

整数の場合、スタックにも格納されます。関数を呼び出すと、整数がコピーされます。

整数を変更したい場合は、次のように、整数のアドレスを渡してポインターの下の値を変更できます。

void function(int *integer)
{
    *integer = 2;
}

int main()
{
    int integer = 1;
    function(&integer);

    printf("%d", integer);

    return 0;
}
于 2013-10-28T22:59:41.403 に答える
0

配列名は、配列の最初の要素へのポインタです。最初のコード サンプルでは、​​最初の配列要素を含むメモリ位置へのポインタを渡しました。2 番目のコード サンプルでは、​​値によって整数を渡しているため、"integer" という名前のローカル変数とは関係ありません。

そのリンクを確認してください

参照渡しと値渡し

参照渡し / C++ の値

于 2013-10-28T22:58:58.527 に答える