Как указывает @ 5gon12eder, адрес первого элемента равнины (C-style) struct
такой же, как и для экземпляра struct
. НО, есть некоторые ошибки, о которых вам нужно знать.
Во-первых, это свойство не имеет места для любой другой член структуры, так что вы не можете просто бросить указатель doublecomplex
на указатель на массив double
и использовать его для доступа к любому элементу за пределами первого (вы можете использовать , но спецификация языка не дает вам эту гарантию).
Во-вторых, она всегда будет безопаснее для доступа к элементу без броска, если вы можете
const doublecomplex * dc;
const double * rp = & dc->r;
const double * ip = & dc->i;
предпочтительнее
const doublecomplex * dc;
const double * rp = reinterpret_cast<const double *>(dc);
const double * ip = ???;
Теперь, если функция приема double *
в виде параметр и вы know его элемент r
doublecomplex
, вы можете смело преобразовать его в doublecomplex *
, но при этом часто возникает проблема, потому что это требует, чтобы кто-либо, вызывающий функцию, следовал этому правилу.
В идеале ваши объявления должны указывать типы с достаточной детализацией, чтобы избежать приведения в целом, но до тех пор, пока вы знаете о ограничениях, налагаемых языком (и соответствующей свободе, предоставляемой разработчиками компилятора), есть несколько четкая граница между тем, что является и не является безопасным.
Действительно ли это C++? Является OpenBlas? Это очень похоже на C-код. – Walter
Хотя литье 'doublecomplex *' to 'double *' является законным, зачем вам это нужно? Это проще и безопаснее писать '& someDoubleComplex.r', чем' reinterpret_cast (& someDoubleComplex) '. –
jamesdlin