2012-05-04 15 views
2

私はそれを自分でテストしたいと思っていますが、現状では残念ながらそれは不可能です。参照データ型のアンパサンドは、参照自体のアドレスまたは参照している値を返しますか?

+1

具体的なコード例で質問を記入してください。 – TemplateRex

+0

関数に渡すときの参照? –

+1

質問はかなり明確です。私が間違っていなければ、リファレンスはどこにあっても参照です。 –

答えて

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; 
} 

Executed online, with resultsとオンラインでコードをテストすることができます。

+0

オンラインコンパイラ?うわー、なぜ私はこれを考えなかったのですか? –

+0

それはかなり華麗です:)あなたはそれを愛するでしょう。 –

+3

参照が格納を必要とするかどうかは不特定であるため、オブジェクトである可能性があります(8.3.2/4)。ただし、参照に適用された式は参照されるオブジェクトに転送されます(§5/ 5) –

5

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

1

値のアドレス。 あなたは常にcodepad上で確認することができます

(参照のアドレスのようなものはありません):ポインタとは異なりhttp://codepad.org/I1aBfWAQ

1

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

試してみてLLVMとクランページにマフムードの例を取ると、私たちは以下のLLVM IR(切り捨て)を取得します。 %x(名前がC関数のそれに似ている疑い):

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 
} 

...構文はあまり重要ではなく、重要なことは、単一の変数が宣言されていることに注意することです。

これは、コンパイラがyzという変数を省略したことを意味します。つまり、これらの変数は割り当てられません。

+0

私はそれにビート:)私は家に帰ると、中間オブジェクトコードのどこかに実際のオブジェクトが作成されているかどうかを確認するつもりでした。今私は、オブジェクトが作成されるのに十分複雑な例を(もしあれば)理解する必要があります。 +1 –

+0

@ MahmoudAl-Qudsi:関数の引数を生成する必要があります。関数がインライン化されていても、静的でない限り、Clangは別の翻訳単位で使用される可能性があるため、その定義を出力します。 –

+0

はい。私の投稿のサンプルコードは、あなたが予測した通り、このLLVMバイトコード:http://pastebin.com/bZ4PZvupになります。 –