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

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

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)
刘奇

이 유형 변환은 2차원 포인터 변수를 1차원 포인터 변수로 변환하는 것입니까?

예, 이 유형 변환은 field 표현식의 유형을 두 번째 수준 포인터에서 첫 번째 수준 포인터로 변환하고 값 범주는 lvalue입니다(&가 추가되지 않으면 rvalue입니다). const도 폐기되었습니다.

프로그램에서 getData 함수의 역할은 가져온 필드가 가리키는 메모리에 값을 할당하는 것입니다. 예를 들어 getData 함수 외부에 double* U를 정의한 다음 getData(name, 유형, U, 단계) U가 가리키는 메모리 할당을 할당하려면 (void&)U 변환이 U에 어떤 영향을 미칠까요?

은 실제 매개변수의 유형(double *)과 형식 매개변수의 유형(double ** const)이 일치하지 않으므로 이렇게 호출할 수 없습니다. (double ** &)U 또는 (double **)U을 통해 호출하는 것을 고려해 볼 수 있습니다. getData의 설명에 따르면 &U은 컴파일이 가능하지만 불가능합니다.

올바르게 호출되고 getData 및 관련 기능이 올바르게 구현되면(field에서 참조하는 개체가 수정되지 않음) U에는 영향이 없습니다.

여기서 불합리한 점은 (void *&)의 유형 변환이 const을 삭제하여 의미론적으로 field에서 참조하는 객체를 변경 가능하게 만든다는 것입니다(U 값을 수정하거나 불변 객체를 수정하여 정의되지 않은 동작이 발생할 수 있음). , 그러나 getData 선언의 표현은 "field은 변경할 수 없습니다"입니다. getData의 설명에 따르면 사실 이 const를 버릴 필요는 없습니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿