从 C 到 D 的数组指针
Array pointer from C to D
我正在使用 D 并与一些 C 库交互。因此,我必须将 D 数组转换为 C 的指针(例如 short*)。目前我只是这样投射它们:
int[] dArray = [0, 1, 2, 3, 4];
myCFunction(cast(int*) dArray);
这不安全吗?我尝试这样做:
myCFunction(&dArray);
但是这样做会给函数一个 int[]* 而不是 int*。我看到在 C++ 中有些人采用这样的第一个元素:
myCFunction(&dArray[0]);
但是那个指针不会只指向第一个元素吗?我是指针和引用的新手,因为我来自 Java.
的世界
如何将数组转换为指针以便将其传递给 C 函数?
在 D 中,数组实际上(概念上)是这样的:
struct {
size_t length;
void* ptr;
};
从数组中获取指针的常用方法是使用 .ptr 字段。在你的情况下:myCFunction(dArray.ptr);
But wouldn't that pointer only point to the first element
因为元素是连续存储在内存中的,所以我们只需要一个指向第一个元素的指针。如果我们想获取其他元素的地址,我们只需向该指针添加一个偏移量。
还有一点:通常如果一个C函数想要一个数组指针,它也有一个数组长度的参数。在大多数情况下,您可以给它 dArray.length
,但有时它实际上要求以字节为单位的大小,而不是元素的数量。
我正在使用 D 并与一些 C 库交互。因此,我必须将 D 数组转换为 C 的指针(例如 short*)。目前我只是这样投射它们:
int[] dArray = [0, 1, 2, 3, 4];
myCFunction(cast(int*) dArray);
这不安全吗?我尝试这样做:
myCFunction(&dArray);
但是这样做会给函数一个 int[]* 而不是 int*。我看到在 C++ 中有些人采用这样的第一个元素:
myCFunction(&dArray[0]);
但是那个指针不会只指向第一个元素吗?我是指针和引用的新手,因为我来自 Java.
的世界如何将数组转换为指针以便将其传递给 C 函数?
在 D 中,数组实际上(概念上)是这样的:
struct {
size_t length;
void* ptr;
};
从数组中获取指针的常用方法是使用 .ptr 字段。在你的情况下:myCFunction(dArray.ptr);
But wouldn't that pointer only point to the first element
因为元素是连续存储在内存中的,所以我们只需要一个指向第一个元素的指针。如果我们想获取其他元素的地址,我们只需向该指针添加一个偏移量。
还有一点:通常如果一个C函数想要一个数组指针,它也有一个数组长度的参数。在大多数情况下,您可以给它 dArray.length
,但有时它实际上要求以字节为单位的大小,而不是元素的数量。