2011-08-17 235 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的值。