這是一個理論問題。C中的參考文獻
我不知道C中的某些構造是如何在沒有引用的情況下在內部執行的。例如:
struct Foo { int a; };
int main() {
struct Foo foo;
foo.a = 10;
return 0;
}
foo.a
是什麼類型的?這絕對不是一個指針,因爲我們將10
指定爲值,而不是地址。但它也不是一種價值類型,因爲它會更改foo
的數據。在C++中,我只是說這是一個參考,但在C?
這是一個理論問題。C中的參考文獻
我不知道C中的某些構造是如何在沒有引用的情況下在內部執行的。例如:
struct Foo { int a; };
int main() {
struct Foo foo;
foo.a = 10;
return 0;
}
foo.a
是什麼類型的?這絕對不是一個指針,因爲我們將10
指定爲值,而不是地址。但它也不是一種價值類型,因爲它會更改foo
的數據。在C++中,我只是說這是一個參考,但在C?
這是一個int lvalue。就像您有int bar
和bar = 10
更改bar
的數據一樣。同樣適用於數組中的任何元素。基本上任何你可以採取的地址是一個左值。
左值狀態與類型無關。
在C++中,引用是「需要」的唯一原因是運算符重載。在C中,=
符號不是需要引用參數的函數調用。這只是一個操作員。它不能被重新定義和做無意義的東西,所以一個正常的左值對它來說是完美的。
請注意,沒有根本原因C++需要此參考。它也可以指定重載的operator=
等函數來接收指針而不是引用。
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
的值相同的指令。
foo.a
的類型是int
。這樣考慮吧:寫作foo.a = 5
與寫作*((int*)(&foo + offset_of_a)) = 5
相同 - 它只是將數據寫入某個存儲位置,該存儲位置將被解釋爲類型爲int
的值。
我從來沒有見過'一位字節'。 –
它會趕上... – Dave