C中的参考文献

时间:2011-08-17 04:09:01

标签: c reference

这是一个理论问题。

我想知道如何在没有引用的情况下在内部执行C中的某些构造。例如:

struct Foo { int a; };
int main() {
  struct Foo foo;
  foo.a = 10;
  return 0;
}

foo.a的类型是什么?它绝对不是指针,因为我们将10指定为值,而不是地址。但它也不是值类型,因为它会更改foo的数据。在C ++中,我只想说它是一个引用,但在C?

4 个答案:

答案 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分配值的指令相同。