4

在 C 中:

int a[10];
printf("%p\n", a);
printf("%p\n", &a[0]);

产量:

0x7fff5606c600
0x7fff5606c600

这是我所期望的。现在,在 D 中,我正在尝试这个(显然没有用例,只是鬼混):

int[] slice = [...];
writeln(&slice);
writeln(&slice[0]);

产量:

7FFF51600360
10E6E9FE0

为什么有区别?看起来像一个完全不同的内存段。(虽然我刚刚想到 D 中的数组可能不仅仅是相邻分配的整数?)

4

3 回答 3

12

在 D 中,数组本质上是一个带有指针和长度字段的结构,并被视为

要获取第一个元素的地址,您可以查询 ptr 字段

于 2013-10-25T16:28:41.267 回答
3

因为“数组”本身使用的解析为指向数组的指针,所以这允许您在使用结构时类似地对待类型指针和类型数组。

int[] slice = [...];
writeln((cast(void*) slice);
writeln(&slice[0]);

应该给你你想要的。

继承自“C” http://c-faq.com/aryptr/aryptrequiv.html

int[] slice = [...];
int* ptr = &slice[0];

writeln(cast(void*) slice);
writeln(&slice[0]);

// value access
writeln(slice[0]);
writeln(*ptr);
writeln(ptr[0]);
于 2013-10-25T16:19:28.173 回答
3

这很简单——动态 D 数组与 C 数组不同。动态 D 数组保存数组的长度,而 C 数组不保存。因此,动态 D 数组不依赖 NULL 来标记数组的结尾。正如亚当在他的评论中指出的那样,静态 D 数组的行为与 C 数组相同。

import std.stdio;

int main() {
  // static array
  int[10] sarr;
  writeln(sarr.length);
  writeln(&sarr);
  writeln(&sarr[0]);

  // dynamic array
  int[] darr = [1, 2, 3];
  writeln(darr.length);
  writeln(&darr);
  writeln(&darr[0]);

  // These are all the same
  writeln(darr.ptr);
  writeln(cast(void*) darr);
  writeln(&darr[0]);

  return 0;
}

(DPaste 链接:http ://dpaste.dzfl.pl/f708d945 )

于 2013-10-26T13:33:18.667 回答