私には2つの機能があります:
void a(int * p);
int b();
関数の戻り値のアドレスを次のようなb
関数に渡すことは可能ですか?a
a(&b())
私には2つの機能があります:
void a(int * p);
int b();
関数の戻り値のアドレスを次のようなb
関数に渡すことは可能ですか?a
a(&b())
複合リテラルはそのトリックを行うようです (C99 コンパイラが必要です):
int a()
{
return 5;
}
void b(int *a)
{
// do something with a
printf("%d\n", *a);
}
int main(void)
{
b(&(int){ a() });
}
出力は5
です。
No. C11 は次のように述べています (強調は私のものです):
6.5.3.2.1
単項 & 演算子のオペランドは、関数指定子、 []または単項 *演算子の結果、またはビット フィールドではなく、レジスタ ストレージ クラス指定子で宣言されていないオブジェクトを指定する左辺値のいずれかでなければなりません。 .
これは明らかに関数、 a[]
または unaryではありません*
。左辺値とは何かを見てみましょう:
6.3.2.1
左辺値は、潜在的にオブジェクトを指定する (void 以外のオブジェクト型を持つ) 式です。64) 左辺値が評価時にオブジェクトを指定しない場合、動作は未定義です。...
64) ''lvalue'' という名前は、最初は代入式 E1 = E2 に由来します。ここで、左側のオペランド E1 は (変更可能な) 左辺値である必要があります。オブジェクトの「ロケーター値」を表していると考えた方がよいでしょう。「右辺値」と呼ばれることがあるものは、この国際標準では「式の値」として記述されています。
左辺値のわかりやすい例は、オブジェクトの識別子です。さらなる例として、E がオブジェクトへのポインターである単項式である場合、*E は、E が指すオブジェクトを指定する左辺値です。
つまり、左辺値はオブジェクトを指定します。b()
特定のオブジェクトを指定しないため、左辺値ではありません。b() = 2;
それが間違っていることも見ることで、これを知ることができます。
いいえ、ではできませんC
。また、 のように参照とC
呼ばれるものがないことに注意してください。C++
それにC
は、同じ動作を達成するためのポインタがあります..
C
次のような一時変数を使用して同じ目標を達成するには、
int val;
val = b();
a( &val ); // & is called as "address of" operator in C
に参照がない理由に答えるために、C
私の理解では、ポインターと参照は同じ目標を達成することを意味しています-データコピーを最小限に抑えるか回避します。thisC
のポインターは十分ですが、技術的には両方に多少の違いがありますC++
(参照用に取得)
b()
への参照を引数として渡してからa
呼び出すことができます:b
a
void a(void (*b)(int)) {
// call b
int local_var = b(<something>);
}