c++ - 二维数组指针double **&field经过这个转换 (void*&) field 是什么意思?

【字号: 日期:2023-03-25浏览:28作者:雯心

问题描述

本人非计算机专业的工科学生,今天读一个开源软件的源代码,遇到了一个奇怪的强制类型转换,代码如下:

void twoWayMPI::getData( word name, word type, double ** const& field, label step) const{ char* charName = wordToChar(name); char* charType = wordToChar(type); data_liggghts_to_of(charName,charType, lmp, (void*&) field, (char *)'double');}

data_liggghts_to_of函数代码如下:

void data_liggghts_to_of(char *name,char *type,void *ptr,void *&data,char* datatype){ //LAMMPS *lmp = (LAMMPS *) ptr; FixCfdCoupling* fcfd = (FixCfdCoupling*)locate_coupling_fix(ptr); fcfd->get_dc()->push(name,type,data,datatype);}

getData函数调用data_liggghts_to_of函数时用了个奇怪的强制类型转换(void*&) field,我想问的问题是:

这个类型转换是把二维指针变量转换成了一维指针变量?

getData函数在程序中的作用是为了给导入field指向的内存赋值,比如我在getData函数外定义了double* U,然后用getData(name, type, U, step)是为了给U指向的内存赋值;那么我想问的是经过(void&)U转换会对U产生什么影响?

问题解答

回答1:

这个类型转换是把二维指针变量转换成了一维指针变量?

对,这个类型转换把表达式field的类型从二级指针转换成了一级指针,value category为左值(若不加&则为右值)。同时丢弃了const。

getData函数在程序中的作用是为了给导入field指向的内存赋值,比如我在getData函数外定义了double* U,然后用getData(name, type, U, step)是为了给U指向的内存赋值;那么我想问的是经过(void&)U转换会对U产生什么影响?

不能这样调用,因为实际参数的类型(double *)和形式参数的类型(double ** const)不匹配,可以考虑通过(double ** &)U来调用或(double **)U。根据getData的描述,&U能过编译,但不可以。

如果是正确调用,且getData及相关函数都正确实现(不修改field所引用的对象),那么不会对U有影响。

这里不合理的是(void *&)处的类型转换丢弃了const,从语义上使得field所引用的对象变得可改(可能修改U的值或修改一个不可改对象从而导致未定义行为),但getData声明时的表达的是“field不可改”。根据getData的描述,实际上没有必要丢弃这个const。

相关文章: