Main Content

传递指针示例

multDoubleRef 函数

shrlibsample 库中的 multDoubleRef 函数将输入乘以 5

EXPORTED_FUNCTION double *multDoubleRef(double *x) 
{
     *x *= 5;
     return x;
}

输入是指向 double 的指针,而该函数也返回指向 double 的指针。MATLAB® 函数签名是:

返回类型名称参量
[lib.pointer,
doublePtr]
multDoubleRef(doublePtr)

传递双精度类型的指针

此示例说明如何构造指针并传递给 C 函数 multDoubleRef

加载包含该函数的库。

if not(libisloaded('shrlibsample'))
    addpath(fullfile(matlabroot,'extern','examples','shrlib'))
    loadlibrary('shrlibsample')
end

构造指向输入参量 X 的指针 Xptr

X = 13.3;
Xptr = libpointer('doublePtr',X);

验证 Xptr 的内容。

get(Xptr)
       Value: 13.3000
    DataType: 'doublePtr'

调用该函数并检查结果。

calllib('shrlibsample','multDoubleRef',Xptr);
Xptr.Value
ans = 66.5000

Xptr 是一个句柄对象。此句柄的副本引用同一个底层对象,对句柄对象执行的任何操作都影响该对象的所有副本。但是,Xptr 不是一个 C 语言指针。虽然它指向 X,但并不包含 X 的地址。该函数修改 Xptr 的 Value 属性,但不修改底层对象 X 中的值。X 的原始值保持不变。

X
X = 13.3000

从现有 lib.pointer 对象创建指针偏移

此示例说明如何创建指向 MATLAB 向量 X 的子集的指针。仅当原始指针存在时,新指针才有效。

创建指向向量的指针。

X = 1:10;
xp = libpointer('doublePtr',X);
xp.Value
ans = 1×10

     1     2     3     4     5     6     7     8     9    10

使用 lib.pointer 加号运算符 (+) 创建指向 X 的最后六个元素的指针。

xp2 = xp + 4;
xp2.Value
ans = 1×6

     5     6     7     8     9    10

多级指针

多级指针是指具有多级引用的参量。MATLAB 中的多级指针类型使用后缀 PtrPtr。例如,使用 doublePtrPtr 表示 C 参量 double **

当调用接受多级指针参量的函数时,可以使用 lib.pointer 对象并让 MATLAB 将其转换为多级指针。

allocateStructdeallocateStruct 函数

shrlibsample 库中的 allocateStruct 函数接受 c_structPtrPtr 参量。

EXPORTED_FUNCTION void allocateStruct(struct c_struct **val) 
{
    *val=(struct c_struct*) malloc(sizeof(struct c_struct));
    (*val)->p1 = 12.4;
    (*val)->p2 = 222;
    (*val)->p3 = 333333;
}

MATLAB 函数签名为:

返回类型名称参量
c_structPtrPtrallocateStruct(c_structPtrPtr)
voidPtr deallocateStruct(voidPtr)

传递多级指针

此示例说明如何将多级指针传递给 C 函数。

加载包含 allocateStructdeallocateStruct 的库。

if not(libisloaded('shrlibsample'))
    addpath(fullfile(matlabroot,'extern','examples','shrlib'))
    loadlibrary('shrlibsample')
end

创建 c_structPtr 指针。

sp = libpointer('c_structPtr');

调用 allocateStruct 以便为结构体分配内存。

res = calllib('shrlibsample','allocateStruct',sp)
res = struct with fields:
    p1: 12.4000
    p2: 222
    p3: 333333

释放 allocateStruct 函数产生的内存。

calllib('shrlibsample','deallocateStruct',sp)

返回字符串数组

假设您有一个库 myLib,其中有一个函数 acquireString,它读取一个字符串数组。函数签名为:

返回类型名称参量
char**acquireString(void)
char** acquireString(void)

以下伪代码说明如何操作返回值,即指向字符串的指针数组。

ptr = calllib(myLib,'acquireString')

MATLAB 创建 stringPtrPtr 类型的 lib.pointer 对象 ptr。此对象指向第一个字符串。要查看其他字符串,请递增指针。例如,要显示前三个字符串,请键入:

for index = 0:2
    tempPtr = ptr + index;
    tempPtr.Value
end 
ans = 
    'str1'
ans = 
    'str2'
ans = 
    'str3'

另请参阅