Вы должны написать, по крайней мере, как
printf("%d \n",*reinterpret_cast<int *>(&s1));
Заполнение не может быть в начале этого класса с одним нестатическим элементом данных. Таким образом, адрес класса равен адресу его единственного члена данных.
На самом деле вы не имеете дело непосредственно с личным членом данных. Вы просто переосмысливаете память. В общем случае по первому адресу класса может быть что угодно, если, например, класс не является типом стандартного макета.
Обратите внимание на то, что в соответствии со стандартом C ++ порядок размещения нестатических данныхЧлены с разным контролем доступа не определены. Так, например, если вы добавите, например, открытый элемент данных, защищенный pr, в ваш класс, то необязательно, чтобы при использовании трюка с адресом класса вы выводили элемент закрытых данных.