这是一个理论问题。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