Знак & есть, чтобы взять адрес obj.
Пример:
#include <cstdio>
void printData(const char* p, int n) {
for(int i = 0; i < n; i++)
printf("byte %2d : %d\n", i, (int)p[i]);
}
struct DataStruct {
int x;
int y;
};
int main() {
DataStruct obj;
obj.x = 5;
obj.y = 257;
char* dataPtr = (char*)&obj;
printData(dataPtr, sizeof(DataStruct));
return 0;
}
где маневр (char *) & obj используется для получения символа *, который можно передать в функцию printData, которая просто хочет, чтобы массив символов печатался.
В этом примере строка
char* dataPtr = (char*)&obj;
вместо этого мог бы быть написан с использованием reinterpret_cast следующим образом:
char* dataPtr = reinterpret_cast<char*>(&obj);
, который сделал бы то же самое. Преимущество использования reinterpret_cast вместо cryptic (char *) & obj состоит в том, что когда вы пишете reinterpret_cast, становится более отчетливо видно, что вы делаете что-то странное и, возможно, опасное в этот момент кода.