2011-08-17 128 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 lvalue。就像您有int barbar = 10更改bar的数据一样。同样适用于数组中的任何元素。基本上任何你可以采取的地址是一个左值。

左值状态与类型无关。

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 ....] 

你发现仪器ction分配foo.b = 1

mov $1, -4(%ebp) 

它是将分配在堆栈上int的值相同的指令。

+0

我从来没有见过'一位字节'。 –

+0

它会赶上... – Dave

1

foo.a的类型是int。这样考虑吧:写作foo.a = 5与写作*((int*)(&foo + offset_of_a)) = 5相同 - 它只是将数据写入某个存储位置,该存储位置将被解释为类型为int的值。