传递指针示例
multDoubleRef
函数
shrlibsample
库中的 multDoubleRef
函数将输入乘以 5
。
EXPORTED_FUNCTION double *multDoubleRef(double *x) { *x *= 5; return x; }
输入是指向 double
的指针,而该函数也返回指向 double
的指针。MATLAB® 函数签名是:
返回类型 | 名称 | 参量 |
---|---|---|
[lib.pointer, | 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 将其转换为多级指针。
allocateStruct
和 deallocateStruct
函数
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_structPtrPtr | allocateStruct | (c_structPtrPtr) |
voidPtr | deallocateStruct | (voidPtr) |
传递多级指针
此示例说明如何将多级指针传递给 C 函数。
加载包含 allocateStruct
和 deallocateStruct
的库。
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'