「単項 & 演算子のオペランドでは、左辺値から右辺値への変換は行われません。」
それが何を意味するのか知っていますか>誰か説明できますか..それをお願いします
元:
int a[]={1,5};
int* x=&a;
「単項 & 演算子のオペランドでは、左辺値から右辺値への変換は行われません。」
それが何を意味するのか知っていますか>誰か説明できますか..それをお願いします
元:
int a[]={1,5};
int* x=&a;
まあ、それは左辺値から右辺値への変換が行われていないことを意味します:-)。左辺値から右辺値への変換は、オブジェクトへの単なる参照ではなく、オブジェクトの値が必要な場合に発生します。オブジェクトのアドレスを取得するのに値は必要ないため、左辺値から右辺値への変換はありません。
これがあなたのコードにどのように関連しているかはわかりません。コードの 2 行目で行われていない変換は、配列からポインターへの変換です。もちろん、左辺値から右辺値への変換も行われていませんが、それはかなり直感的で正常です。ただし、配列からポインターへの変換は、式で配列を使用するほとんどの場合に発生するため、一部の人々はさらに驚くかもしれません。(実際には、配列からポインターへの変換は必要な場合にのみ発生します。しかし、配列に対して有効な操作は非常に非常に少ないため、必要になることが非常に多いです。) 単項 & 演算子の場合、配列からポインターへの変換は行われません。 ' は実行されません (配列からポインターへの変換の結果は右辺値であり、単項 & には左辺値が必要なため、実行できません)。つまり、配列のアドレスを取得しています。)[2]、つまり、2 つの int の配列へのポインター。ターゲットの型が int ( )[2] ではなく int* であり、2 つの間に暗黙的な変換がないため、代入が不正になります。
式では、左辺値から右辺値への変換は、オブジェクトの値を調べることを指し、オブジェクト値が必要な場所で使用されます (たとえば、a + b
値が必要でa
、b
結果を決定するために、場所を知る必要はありません - ifどこでも - 元のオブジェクトの由来)。
address-of演算子では、オブジェクト自体 (つまりlvalue )が必要です。オブジェクトの値は無関係であるため、左辺値から右辺値への変換は役に立ちません。オブジェクト自体の ID (場所) が失われます。アドレスを取るために重要なこと。
int a[] = {1, 5}; int* x = &a;
それはタイプエラーです。&
演算子は、そのオペランドへのポインターを生成します。ここでのオペランドは何ですか?2 つの整数の配列。2 つの整数の配列へのポインターint*
は型ではなく、型 int(*)[2]
です。
ここで引用したルールがどのように適用されるかに注意してください。多くのコンテキストでは、配列の名前はその最初の要素へのポインターに崩壊します。(しかし、一般的に、配列とポインターは同じではありません!) と言うと、それが起こりますint* x = a;
。ただし、演算子を配列に適用すると、この減衰は発生しません。&
(その変換が行われた場合&a
、 は のアドレスのアドレスを取得しようとしますがa
、これはナンセンスです。)