1. ホーム
  2. c++

[解決済み] C++で&と*で宣言された関数の引数の違いについて

2023-03-20 14:19:50

質問

次のような例を入力しました。

#include <iostream>
double f(double* x, double* y)
{
    std::cout << "val x: " << *x << "\n";
    std::cout << "val y: " << *y << "\n";
    return *x * *y;
}
double f2(double &x, double &y)
{
    std::cout << "val x: " << x << "\n";
    std::cout << "val y: " << y << "\n";
    return x * y;
}
int main()
{
    double a, b;
    a = 2;
    b = 3; 
    std::cout << f(&a, &b) << "\n";
    std::cout << f2(a, b) << "\n";
    return 0;
}   

関数の中で f x と y をポインタとして宣言し、その値を取得するために *x . を呼び出すと f を呼び出すとき、渡された引数のアドレスを渡す必要があります。 &a, &b . f2 は定義が違うだけで同じです。

さて、私の疑問は、メモリ管理に関してはどちらも本当に同じなのでしょうか?どちらも渡された値のコピーを作成せず、代わりに参照を渡しているのでしょうか? 私は f2 のアドレスを読み取ることができなかったからです。 xf2 だから私は 知っている でxとyについてもっと f (そこで私はアドレスと値を知っています)。

事前にありがとうございます

編集 : なるほど、ありがとうございます。もう少し調べてみたら、かなり有用なトピックを見つけました。

ポインタと参照 googleコーディングガイドラインへのリンクもあります。 http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Reference_Arguments これはかなり useful 今更ながら、主体的な嗜好の一種であることを実感。 クリア

どのように解決するのですか?

f2 は参照によって引数を取っていますが、これは本質的には エイリアス というものです。 ポインタと参照の違いは、参照はNULLではありえないということです。 を使うと f を渡す必要があります。 アドレス (を渡す必要があります。参照渡しの場合は、パラメータを渡すだけでエイリアスが作成されますが、ポインタに渡すパラメータのアドレス(&演算子を使用)を渡す必要があります。

const参照による受け渡し ( const double& ref ) は、関数内部で引数を変更しない場合に好ましく、引数を変更する場合には、非constリファレンスを使用します。

ポインターは、主に以下のような場合に使用されます。 NULL をパラメータに渡せるようにする必要がある場合に使われます。 NULL であるかどうかをチェックする必要があります。