2

自分でテストできたらよかったのですが、残念ながら現在の状況ではテストできません。誰かがこれに光を当ててくれませんか?

4

4 に答える 4

5

参照している値のアドレスを返します。

于 2012-05-04T09:29:51.410 に答える
4

ポインタとは異なり、参照は実際にはオブジェクトではありません。アドレス自体はありません。コンパイラが解釈するオブジェクトのエイリアスと考える方が簡単です。

とにかく、IdeOneを使用していつでもオンラインでコードをテストできます

#include <stdio.h>

void func(int &z)
{
    printf("&z: %p", &z);
}

int main(int argc, char **argv)
{
    int x = 0;
    int &y = x;

    printf("&x: %p\n", &x);
    printf("&y: %p\n", &y);

    func(x);

    return 0;
}

オンラインで実行され、結果が得られます

于 2012-05-04T09:31:50.633 に答える
1

値のアドレス。(照会先住所などはありません)

あなたはいつでもコードパッドでチェックすることができます:http://codepad.org/I1aBfWAQ

于 2012-05-04T09:30:32.367 に答える
1

さらなる実験:中間結果の検査を可能にするオンラインコンパイラがあります!

[LLVMとClangを試す]ページのMahmoudの例を見ると、次のLLVM IR(切り捨てられた)が得られます。

define i32 @main() nounwind uwtable {
  %x = alloca i32, align 4
  store i32 0, i32* %x, align 4, !tbaa !0
  %1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([8 x i8]* @.str, i64 0, i64 0), i32* %x)
  %2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([8 x i8]* @.str1, i64 0, i64 0), i32* %x)
  %3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([7 x i8]* @.str2, i64 0, i64 0), i32* %x) nounwind
  ret i32 0
}

...構文はそれほど重要ではありません。重要なのは、単一の変数が宣言されていることに注意することです:(%xその名前はC関数の名前と疑わしいほど似ています)。

これは、コンパイラが変数yz変数を削除したことを意味し、ストレージが割り当てられることはありません。

私はあなたにアセンブリリストを惜しまないでしょう;)

于 2012-05-04T13:06:47.817 に答える