2013-10-25 87 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

相關問題