c++ - 二维数组指针double **&field经过这个转换 (void*&) field 是什么意思?
巴扎黑
巴扎黑 2017-04-17 15:33:12
0
1
1094

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

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,我想问的问题是:

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

  2. 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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板