2016-08-22 16 views
5

我正在使用D并与一些C库进行接口连接。因此,我必须将D数组转换为C的指针(例如short *)。目前我只是这样投:从C到D的数组指针

int[] dArray = [0, 1, 2, 3, 4]; 
myCFunction(cast(int*) dArray); 

这是不安全的吗?我试图做:

myCFunction(&dArray); 

但是这样做给了函数一个int [] *而不是int *。我看到在C++中有些人采取了这样的第一个元素:

myCFunction(&dArray[0]); 

但是,那个指针只会指向第一个元素吗?我是来自Java世界的指针和引用的新手。

我该如何将数组转换为指针,以便将其传递给C函数?

+2

会不会'myCFunction(dArray)'工作? –

+1

数组中的元素在内存中是连续的,因此'&dArray [0]'确实是第一个元素的地址;然而,其余的元素是从该偏移量+1,+2等。此外,仅仅传递数组会将其分解为指向第一个元素的指针。 'myCFunction(dArray)'或'myCFunction(&dArray [0])'都应该可以工作 – yano

+0

@EugeneSh。它没有。编译器抱怨说myCFunction(int *)不接受参数myCFunction(int []); – jython234

回答

11

在d,阵列实际上(在概念上)是这样的:

struct { 
    size_t length; 
    void* ptr; 
}; 

从阵列得到一个指针的通常的方法是使用.ptr字段。你的情况:myCFunction(dArray.ptr);

但不会是唯一的指针指向第一个元素

因为元素被连续存储在内存中,一个指向第一个元素是我们所需要的。如果我们想获取其他元素的地址,我们只需为该指针添加一个偏移量。

另一点:通常如果一个C函数想要一个数组指针,它也有一个数组长度的参数。在大多数情况下,你可以给它dArray.length,但有时它实际上是以字节为单位,而不是元素的数量。

+1

另外这里是一个链接到规范:https://dlang.org/spec/arrays.html#array-properties – WebFreak001