本人非计算机专业的工科学生,今天读一个开源软件的源代码,遇到了一个奇怪的强制类型转换,代码如下:
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产生什么影响?
怪我咯2017-04-17 15:35:12
この型変換は 2 次元のポインタ変数を 1 次元のポインタ変数に変換するものでしょうか?
はい、この型変換は式 field
の型を第 2 レベルのポインターから第 1 レベルのポインターに変換します。値のカテゴリは左辺値です (& が追加されていない場合は右辺値です)。 const
も破棄されました。
プログラム内の getData 関数の役割は、インポートされたフィールドが指すメモリに値を割り当てることです。たとえば、getData 関数の外側で double* U を定義し、getData(name, type, U, step) to assign U が指すメモリ割り当て; 次に、(void&)U 変換が U にどのような影響を与えるかということです。
は、実パラメータ (double *
) の型と仮パラメータ (double ** const
) の型が一致しないため、このように呼び出すことはできません。(double ** &)U
または (double **)U
を介して呼び出すことを検討できます。 getData
の説明によると、&U
はコンパイルできるようですが、コンパイルできません。
が正しく呼び出され、getData
と関連関数が正しく実装されている場合 (field
によって参照されるオブジェクトが変更されていない場合)、U
には影響はありません。
ここで不合理なのは、(void *&)
での型変換が const
を破棄し、意味的に field
によって参照されるオブジェクトが変更可能になることです (おそらく U の値が変更されるか、不変オブジェクトが変更され、結果として未定義の動作が発生します)。 , しかし、getData
宣言の表現は「field
は変更できません」となっています。 getData
の説明によると、実際にはこの const
を破棄する必要はありません。