2

あなたが持っていると言う

void foo(int a, int &b, int *c){...}

int main(){
   int d=0, e=1, f=2;
   foo(d, e, &f);
}

関数宣言のパラメーターは、引数と同じ型でなければならないことを理解しています。したがって、d、e、および f はすべて int であるため、a、b、および c の前の「int」。

しかし、これは参照とポインター、つまり&とにも拡張されますか (また適用されますか) *? 私が言いたいのは、もしあなたが を持っているならint &beすでに住所である必要があるということですか?

私はそう思っていましたが、このスレッドを読んだ後、概念が間違っていると思います: C++ functions: ampersand vs asterisk で概説されているコードは、私が上に書いたものとほとんど同じです。

スレッドと上記のコードを読んだ後、パラメーターの&and*は実際には「型制限」の一部ではないようです。つまり、e がアドレスでなければならない、または f がポインターでなければならないという意味ではありません。 .

a, b, c参照してください、パラメーターのパラメーター名を進めたものは何でも、それがどのタイプでなければならないかを厳密に指定していると思いました

したがって、次のようにコーディングします。

void foo(int a, int &b, int *c){...}

int main(){
   int d=0, e=1, f=2;
   foo(d, &e, *f); // wrong 
}

代わりに&、パラメータの は実際に渡された変数/オブジェクト引数を取り、そのアドレスを変更または取得しているようです。そして、*実際には、引数として渡された f ( &f) のアドレスに作用し、その内容を取得しています。これは正しいですか?

これは、指定されたプロトコル/ルールで&あり*、受け入れなければならないパラメーターに配置されていますか?

パラメータの参照とポインタに関する多くの記事を読んだことがありますが、それらはすべて、パラメータの&and*を使用すると、渡された変数の値を変更できることを非常に明確に説明しています。ただし、パラメーターに配置された場合、&およびの実際の手順/プロトコルに深く入り込むことはありません。*

http://www.cplusplus.com/doc/tutorial/functions2/

http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/

これが概念的に正しいかどうか教えてください。ありがとうございました!

4

3 に答える 3

5

C++ では、同じ演算子が異なるコンテキストで異なる目的に使用されるため、疑問が生じます。たとえば、次の演算子は状況によって意味が異なります。

演算子は、変数または変数への a&を意味します。たとえば、次のコードを考えてみましょう。address-ofreference

int *ptr;    
int n=111;    
ptr=&n;

上記のコードでは、演算子&は変数のアドレスを取得します n

次に、以下に示すコードを考えてみましょう。

   int a=111;    
   int &ref = a;

Here&は、変数への参照を作成するために使用されますa。変数 ref を使用して、変数 a にアクセスできます。

演算子*を使用して、ポインター変数を作成したり、変数の内容をフェッチしたりできます。たとえば、次のコードを考えてみましょう。

int *ptr;   

上記のコードでは、演算子を使用してポインター変数として* 宣言しています。ptr

次に、以下に示すコードを考えてみましょう。

int a=111,b;    
int *ptr = &a;
b=*ptr;

ここで*ptrは、 のコンテンツを取得するために使用されaます。

C++ にも、異なるコンテキストで異なる意味を持つ他の演算子があります。たとえば、

演算子+は、単項演算子または 2 項演算子にすることができます。たとえば+、式の二項演算子と式c=a+b;の単項演算子です。b=+a;

演算子-は、単項演算子または 2 項演算子にすることができます。たとえば-、式の二項演算子と式c=a-b;の単項演算子です。b=-a;

于 2013-05-25T08:56:19.457 に答える
4

本を開いて、少なくとも一度は読む必要があると強く思います。アンパサンド (&) とアスタリスク (*) は同じことを行いますが、見た目と動作が異なるだけです。

始めること、

ご存知のように、ポインターはアドレスを格納するデータ型です。つまり、その目的は別の変数を指すことです。

参考文献 - それらについての 2 つのこと。1)。参照は、それらが参照しているオブジェクト/変数の単なる別の名前です。2)。ポインタの乱雑で複雑な構文を克服するために、参照が導入されました。両方の宣言と使用法を参照してください。

int  num = 45;
int* ptr = #
int& ref = num;

ptr と ref の両方が num を指しています。それらの構文と、値を逆参照する方法にも注意してください。

cout<<*ptr;
cout<<ref;

これで、何が違い、何がきれいに見えるか、自分自身を見ることができます...

-ブペシュ

于 2013-05-25T09:46:32.217 に答える
2

ポインターは、何かへのアドレスを保持する変数です。リファレンスとは、実際には、素敵なパッケージと、美味しそうに見せるための写真にたくさんの砂糖が入ったポインターです。内部では、一度開くと同じことが行われます。

彼らが参照を作成するためにポインターの周りに素敵なパッケージを配置したとき、参照を にできないという点で少し安全になりましたNULL。ポインターは になる可能性があるNULLため、最初にそれを確認する必要があります [または確認しないでください。ただし、クラッシュする可能性があります。これはあまり良くありません...]。

素敵なパッケージングは​​、コンパイラーが参照用のアドレスを渡すことを知っていることを意味します。ポインターがある場合は、パラメーターとしてポインター変数を使用するか、アドレス演算子を使用して、それが渡されたアドレスであることを確認する必要があります。 .

&彼らが「これは参照です」に を使用した理由は、「ここでアドレスを渡す場合、変数を関数に渡すときに何もする必要がない場合、コンパイラが修正する」という事実に関連していると確信していますそれはあなた次第です」。

ポインターを宣言するときは、*- を使用します。これは、変数と関数への引数の両方に適用されます。

他の場所で&は、何かの「アドレス」を意味し(これをポインターにする)、*「このポインターが指すもの」を意味します。繰り返しになりますが、適切なパッケージングは​​、*参照を使用するときに がビューから隠されていることを意味しますが、コンパイラーがそれらのことを行います。

于 2013-05-25T09:00:45.230 に答える