0

私は C++ へのジャンプを進めていて、ポインタに関するセクションに到達したところです。その結果、最初の壁に到達しました。私はこの問題を解決しようとしています:

問題 13.4

2 つの入力引数を取り、2 つの別個の結果を呼び出し元に提供する関数を作成します。1 つは 2 つの引数を乗算した結果で、もう 1 つはそれらを加算した結果です。関数から直接返すことができるのは 1 つの値のみであるため、ポインターまたは参照パラメーターを介して 2 番目の値を返す必要があります。

私は本当に質問を理解していません。たとえば、関数を記述する必要があります。

int function(int x, int y){
    int addition = x + y;
    int multi = x * y;
}

しかし、私は質問を完全に理解していないので、ポインターに合わせる方法がわかりません。誰かが私のためにそれを馬鹿にすることができれば、私は感謝します.

御時間ありがとうございます!

4

8 に答える 8

5

あなたが試すことができます

  int functionPtr(int x, int y, int* addition) {
    // As JustSid mentioned in the comment, it would be good to check the pointer first
    if (addition) {
      *addition = x + y;
    }
    return x * y;
  }

または

  int functionRef(int x, int y, int& addition){
    addition = x + y;
    return x * y;
  }

そして、あなたが彼らに電話したいとき

int x = 1;
int y = 2;
int addition1 = 0;
int multi = functionPtr(x, y, &addition1);

int addition2 = 0;
int multi = functionRef(x, y, addition2);
于 2013-06-06T17:18:26.443 に答える
2

これは、呼び出し元が他の結果のための余地を提供することを意味します。
例:

int function(int x, int y, int& res2)
{
  res2=x+y;
  return x*y;
}
于 2013-06-06T17:17:58.287 に答える
0

問題は「入力引数を 2 つ取る関数」であるため、関数に 3 つのパラメーターを含めることはできません。これを実現する 1 つの方法は、配列へのポインタを返すことです。そう

int * function(int x, int y) {
    int * res = new int[2];
    //Perform computation
    //res[0] = ...
    //res[1] = ...
    return res;
}

呼び出し元の関数で配列メモリの割り当てを解除する必要があることに注意してください。

于 2013-06-06T17:31:15.587 に答える
0

私は C++ に非常に慣れていないので、答えが少しずれている場合はご容赦ください。ただし、基本的にポインターは、データ自体ではなく、データの ADDRESS OF を与える変数です。これは、整数のアドレスを関数に渡して、その関数がポインタを追跡し、その整数のメモリ位置にデータを格納できるようにすることを意味します。変数またはオブジェクトのアドレスを取得するにはアンパサンド (&) を使用し、ポインターをたどるにはアスタリスク (*) を使用します。

例:

int main(void){
  int x = 2;
  int y = 3;
  int multiplicationResult = 0;
  int additionResult = twoOperations(x, y, &multiplicationResult); // The ampersand allows us to pass in a pointer to the memory address of multiplicationResult, rather than the value currently stored in it (0)
  // additionResult will now be 5
  // multiplicationResult will now be 6 - our function was able to store the result in memory using the pointer so we didn't need to use an assigment statement.
}

int twoOperations(int x, int y, int *multiResult){
  int addition = x + y;
  *multiResult = x * y; // The asterisk basically means "follow this pointer and store the result in that memory location."
  return addition;
}

自分でコードを読むとき、私は最初に次のようにシンボルを声に出して読んでポインターの扱い方を学びました:

お役に立てれば!

于 2013-06-06T17:26:05.480 に答える
0

これは、テキストの重要な部分です。

2 つの入力引数を取り、呼び出し元に 2 つの個別の結果を提供する関数を作成します[...]

これは、 の呼び出し元がsumAndProductそれを呼び出して合計と積の両方を受け取ることができることを意味します。この架空の構文は意味を伝えます。

int main() {
    int sum;
    int product

    (sum, product) = sumAndProduct(29, 541);

    printf("the sum of the two numbers is %d and the product is %d\n", sum, product);
}

ただし、C にはそのような構文はありません。この演習では、既存の C 構文でそれを行う方法を見つけるように求められます (ヒント: 関数パラメーターの型はint*またはである可能性がありint&ます)。

編集: 4 つの引数を取る関数を使用できます。そのうちの 2 つが入力引数で、2 つが出力引数です。したがって、正確に 2 つの入力引数を取る 4 引数の関数があります。

于 2013-06-06T17:29:39.150 に答える