1

私はこの宿題の問題を抱えています:

パートA

次のデータ型が参照または値によって渡されるかどうかをテストし、検出したものを端末に出力する C プログラムを作成します。

  • 整数
  • int の配列

仮に、int が値渡しされ、int の配列が値渡しされていることをプログラムが検出した場合、int: pass-by-value array of ints: pass-by-value のような出力を生成する必要があります。

int は理解していますが、得られないのは次のとおりです。

  1. 配列を渡す唯一の方法は、配列の最初の値のアドレスを渡すことだと思いました
  2. これは、値渡しまたは参照渡しとしてカウントされますか? (配列を値で関数に渡すと混乱しました)
  3. これを行う方法のヒントはありますか? 参照を別の関数に渡して操作し、変更されたかどうかを確認するようなことを想定していますが、よくわかりません....

編集: 誰かが次のような具体的な例でこれを説明してくれた場合に役立つかもしれません: メモリ位置 0 に長さ 10 の int の配列が格納されているとします (ええ、実生活ではありませんが、例のために. ..)。その配列が参照によって渡された場合、どのように見えるでしょうか? 値で渡された場合、どのように見えますか?

4

2 に答える 2

5

これは、値渡しまたは参照渡しとしてカウントされますか?

「関数に配列を渡す」と言うと、実際には最初の要素へのポインタが関数に渡されます。これにより、呼び出された関数が配列の内容を変更できるようになります。作成される配列のコピーがないため、配列は参照によって渡されると言うことは理にかなっています。

これを行う方法のヒントはありますか?

テストは次のようにする必要があります。

  1. でローカル配列を作成しますmain()
  2. 既知のパターンで埋める
  3. 配列の内容を出力する
  4. 配列を関数に渡す
  5. 関数本体内で配列の内容を変更します
  6. 関数内の配列を出力します
  7. main()ローカル配列の内容をもう一度印刷します
  8. 出力が6一致7する場合。あなたには証拠があります。

配列をどのように値渡ししますか?

配列を値で渡す唯一の可能な方法は、構造体でラップすることです。
オンラインサンプル:

#include <iostream>

struct myArrayWrapper 
{
    int m_array[5];
};

void doSomething(myArrayWrapper a) 
{
    int* A = a.m_array;

    //Display array contents
    std::cout<<"\nIn Function Before Modification\n";
    for (size_t j = 0; j < 5; ++j)
       std::cout << ' ' << A[j];
    std::cout << std::endl;

     //Modify the array
     for (size_t j = 0; j < 5; ++j)
       A[j] = 100;

    std::cout<<"\nIn Function After Modification\n";
    //Display array contents
    for (size_t j = 0; j < 5; ++j)
       std::cout << ' ' << A[j];
    std::cout << std::endl;

}

int main()
{
    myArrayWrapper obj;
    obj.m_array[0] = 0;
    obj.m_array[1] = 1;
    obj.m_array[2] = 2;
    obj.m_array[3] = 3;
    obj.m_array[4] = 4;
    doSomething(obj);

    //Display array contents
    std::cout<<"\nIn Main\n";
    for (size_t j = 0; j < 5; ++j)
       std::cout << ' ' << obj.m_array[j];
    std::cout << std::endl;

    return 0; 
}

出力:

In Function Before Modification
 0 1 2 3 4

In Function After Modification
 100 100 100 100 100

In Main
 0 1 2 3 4
于 2012-06-22T15:05:30.197 に答える
2

C は引数を値によってのみ関数に渡します。

強力な Kernighan & Ritchie の第 2 版から:

(1.8、値による呼び出し) 「C では、すべての関数の引数は「値」によって渡されます。

于 2012-06-22T15:06:18.687 に答える