MATLAB MEX文件中mxArray* plhs[]与mxArray** plhs的区别问询
关于MEX函数参数
mxArray *plhs[]与mxArray** plhs的区别 问题背景
日常使用C语言(非专家),熟悉MATLAB,仅少量使用过C++且已许久未用。近期首次接触MATLAB的MEX功能,学习官方基础示例时,发现入口函数mexFunction的参数写法此前未见过:
/* The gateway function */ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { /* variable declarations here */ /* code here */ }
原本以为输出、输入参数会是mxArray *plhs这类形式,也理解因需返回多种类型(如标量、矩阵等)可能需要指针的指针(即mxArray** plhs),但示例中使用的是mxArray *plhs[]。了解到该语法表示指针数组,想请教这两种写法是否存在区别?
解答
在C语言的函数参数列表里,这两种写法是完全等价的——编译器会自动把函数参数中的数组声明mxArray *plhs[]调整为指针的指针mxArray** plhs,它们在内存中的存储和访问方式没有任何区别。
不过两者在语义上有细微差异:
mxArray *plhs[]的写法更直观,它明确传达了一个信息:这是一个存储mxArray指针的数组,对应MATLAB里的多个输出变量,nlhs就是这个数组的有效长度。mxArray** plhs是更抽象的“指针的指针”写法,功能上和前者完全一致,但从语法本身看不出“数组”的含义,需要结合上下文理解它指向的是一组指针。
在函数内部使用时,两种写法的操作完全相同:比如访问第一个输出变量的指针,既可以写plhs[0],也可以写*(plhs + 0),效果没有区别。MATLAB在调用MEX函数时,会预先分配好这个指针数组的空间,我们只需要给数组里的每个指针赋值(指向创建好的mxArray对象)即可。
内容的提问来源于stack exchange,提问作者Nukesub
相关产品推荐
相关产品推荐

