2013-10-25 83 views
4

在C:为什么&array!=&array [0]?

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中的数组可能不仅仅是相邻分配的整数吗?)

+2

因为 “阵列” 本身是一个指针数组。 – kfsone

回答

12

在d阵列实质上是一个带有指针和一个长度字段的结构体和被处理为这样

获得地址到第一元件你可以查询ptr字段

+4

对于动态数组而言,具有静态长度的数组(如int [10])的工作方式如同C. –

+3

@ AdamD.Ruppe:您仍然应该使用'.ptr'来获取指向第一个元素的指针。另外,值得注意的是静态数组通过函数参数的值传递,即整个数组被复制。 –

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]); 
+0

有道理。谢谢! – maligree

+0

禁止使用C型表演。使用'cast(void *)slice'代替示例:http://dpaste.dzfl.pl/f708d945 – DejanLekic

+0

doh,很好。 – kfsone

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链路:http://dpaste.dzfl.pl/f708d945

+0

Woah,DPaste?甜。 – maligree

相关问题