在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中的数组可能不仅仅是相邻分配的内容?)
答案 0 :(得分:12)
获取可以查询ptr字段的第一个元素的地址
答案 1 :(得分:3)
由于“array”本身解析为指向数组的指针,因此在使用结构时,这允许您对类型指针和类型数组进行处理。
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]);
答案 2 :(得分:3)
很简单 - 动态D阵列与C阵列不同。动态D数组保持数组的长度,而C数组则不保存。因为这样的动态D数组不依赖于NULL来标记数组的末尾。正如Adam在评论中指出的那样,静态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 link:http://dpaste.dzfl.pl/f708d945)