【问题标题】:C中的地址运算符
【发布时间】:2022-01-23 10:28:54
【问题描述】:

在C编程中,地址操作符&会导致对象的首地址吗?

例如:

int a[2] = {10, 20};   
int* arrays_first_address = &a;

&a 表示“数组的第一个地址”,那么我可以概括它,以便地址运算符产生对象的第一个地址吗?

【问题讨论】:

  • 对,就是对象的起始地址。还会是什么?
  • 是的,a 将指向数组中第一个元素的第一个字节。它始终是结构/数组等的第一个成员/元素的第一个字节的地址。
  • (过度简化警告):一个对象没有“首地址”,它只有一个地址。 对象标识可以定义为地址相等。
  • int a = {10, 20};int a = 10; 相同。

标签: c


【解决方案1】:

a&a 之间存在细微差别。

a 是一个数组,它在大多数表达式中衰减为指向其第一个元素的指针,在本例中为 int*。这意味着写 a&a[0] 在大多数情况下是 100% 等效的。

&a 是不发生数组衰减的例外情况之一,因此您会得到一个指向数组的指针,键入int(*)[2]。这可以被视为“指向整个数组的指针”而不仅仅是第一项。它与int* 不兼容,这就是您的代码不是有效C 的原因。(不,它不能编译正常,这是违反约束的,请参阅What must a C compiler do when it finds an error?

但是,整个数组和该数组中的第一项自然位于相同的地址。所以无论指针类型如何,你都会得到相同的地址。

【讨论】:

    【解决方案2】:

    我建议运行这个程序:

    int a[2] = {10, 20}; printf("a=%p\n", a); printf("&a=%p\n", &a); printf("&(a[0])=%p\n", &(a[0]) );

    你应该有答案。

    在 C 中,数组也被视为指针,但没有真正分配该值的内存。因此,习惯上说“a”和“&a”具有相同的值。

    【讨论】:

      【解决方案3】:
      int a[2];
      

      如果你使用 &a,它会给你 a[0] 的地址。

      &a = &a[0]
      

      数组名是指向它的第0个元素的指针,即基地址。

      然后您可以使用基地址来获取其他位置的地址。 比如&a[1] = (a + 1)

      【讨论】:

      • 严格来说&a会给出a的地址,整个数组。这就是为什么int* arrays_first_address = &a; 不是有效的 C,指针类型不兼容。
      • 数组名是 not 指向其第 0 个元素的指针。实际上,它仅在大多数情况下被隐式转换。
      猜你喜欢
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多