Вы не можете, модель памяти C ++ не работает так.
Единственными действительными указателями являются те, которые получены оператором &, возвращаемые из new / malloc и статических массивов. Не существует механизма для проверки, является ли адрес памяти (все еще) действительным или объект был уничтожен или вообще не существовал там. Так что программист должен управлять правильностью указателей.
По указанным выше причинам ваша программа имеет неопределенное поведение.
if(pointer)
только проверяет, является ли pointer==0
, не более того. Обратите внимание, что int n=5; int array[n];
также не является допустимым C ++. Не уверен, что вы используете его, но если вы это делаете, не надо.
Основываясь на комментариях, вы хотите гетерогенный контейнер. В этом случае используйте массив союзов или лучше std::array<std::variant<int,double,char, float...>> array;
. Или std::vector
, если вам нужен динамический размер.
C ++ гарантирует, что массивы ([]
, malloc
или new[]
) являются смежными, но они содержат только один тип. Как правило, вы не можете хранить float, double, int, char
непрерывно вместе из-за проблем с выравниванием. Выше array
является непрерывным с точки зрения объекта std::variant
, но его размер будет, по крайней мере, размером самого большого типа. Так что chars
не будет упакован вместе.