2011-08-17 5 views
0

これは理論的な質問です。Cの参考文献

Cの特定の構造が内部的に参照なしでどのように実行されるのだろうかと思います。たとえば、

struct Foo { int a; }; 
int main() { 
    struct Foo foo; 
    foo.a = 10; 
    return 0; 
} 

foo.aの種類は何ですか。アドレスではなく、10を値として割り当てているので、間違いなくポインタです。しかし、それは値のタイプでもありません。なぜなら、それはfooのデータを変更するからです。 C + +では、私はちょうど参照だと言うだろうが、Cで?

答えて

7

これは極小値です。 int barと同じで、bar = 10barのデータを変更します。配列内のどの要素にも同じです。基本的にあなたがアドレスを取ることができるものはすべて左辺値です。

Lvalueステータスはタイプに依存しません。

1

C++で参照が「必要」になっている唯一の理由は、演算子のオーバーロードです。 Cでは、=符号は、参照引数を必要とする関数呼び出しではありません。それは単なる演算子です。それは再定義することができないし、無意味なものを行うように作られていないので、通常の左辺値はそれに対して完璧です。

これにはC++で必要とされる根本的な理由はないことに注意してください。オーバーロードされたoperator=などの関数を参照ではなくポインタを受け取るように指定することもできます。

0

cの構造体は実際には大きなプリミティブです。 fooの代入のために生成されたアセンブラを見ると、intのようにしか動作しません。私は構造体の定義を持っている

:ここでは例です

typedef struct Foo Foo; 
struct Foo { 
    int a, b; 
}; 

そして私はFooの宣言:

Foo foo = {0,1}; 

スタック(少しマシン固有のものはオーバー練り、しかしにされています(4ビットの整数と1ビットのバイトを仮定)

%esp %ebp[-8] %ebp[-4] %ebp 
[.... 0000  0001 ....] 

あなたは、 foo.b = 1を割り当てるctionはスタック値にintを割り当てるのと同じ命令である

mov $1, -4(%ebp) 

です。

+0

私は以前に「1ビットバイト」を見たことがありません。 –

+0

それはキャッチします... – Dave

1

foo.aのタイプはintです。これについて考えてみましょう:foo.a = 5を書くことは、*((int*)(&foo + offset_of_a)) = 5と同じです。それは、タイプintの値と解釈される特定のメモリ位置にデータを書き込むことです。

関連する問題