这是一个理论问题。
我想知道如何在没有引用的情况下在内部执行C中的某些构造。例如:
struct Foo { int a; };
int main() {
struct Foo foo;
foo.a = 10;
return 0;
}
foo.a
的类型是什么?它绝对不是指针,因为我们将10
指定为值,而不是地址。但它也不是值类型,因为它会更改foo
的数据。在C ++中,我只想说它是一个引用,但在C?
答案 0 :(得分:7)
这是一个整体价值。与您int bar
相同,bar = 10
更改bar
的数据。同样适用于数组中的任何元素。基本上你可以拿地址的任何东西都是左值。
左值状态与类型无关。
答案 1 :(得分:1)
C ++中“需要”引用的唯一原因是运算符重载。在C中,=
符号不是需要引用参数的函数调用。它只是一个操作员。它不能被重新定义并做成无意义的东西,所以正常的左值对它来说完全没问题。
请注意,C ++也没有必要参考的基本原因。它也可以指定重载的operator=
等函数来接收指针而不是引用。
答案 2 :(得分:1)
foo.a
的类型为int
。以这种方式思考:编写foo.a = 5
与编写*((int*)(&foo + offset_of_a)) = 5
相同 - 它只是将数据写入某个内存位置,该位置将被解释为类型int
的值。
答案 3 :(得分:0)
c中的结构实际上只是大原语。如果你看看为你的foo赋值生成的汇编程序,它就像一个int。这是一个例子:
我有我的结构定义:
typedef struct Foo Foo;
struct Foo {
int a, b;
};
我宣布了一个Foo:
Foo foo = {0,1};
堆栈(一些特定于机器的东西被掩盖,但一般而言)看起来像这样(假设4位整数和一位字节)
%esp %ebp[-8] %ebp[-4] %ebp
[.... 0000 0001 ....]
您发现指定foo.b = 1
的指令是
mov $1, -4(%ebp)
与在堆栈上为int
分配值的指令相同。