Лучшее, что вы можете сделать, это использовать массив вместо необработанного указателя.Поскольку массив уменьшается до указателя практически в каждом случае использования, он будет вести себя примерно так, как вам нужно.
double d[] = {3};
будет выделять пространство (глобально или в стеке, в зависимости отвыполняется ли это в глобальном или функциональном масштабе) и инициализируется сразу.Практически во всех случаях обращение к d
приведет к его снижению до double*
.
Основное отличие состоит в том, что для массивов, выделенных стеком (область действия функции, без квалификатора static
), массивживет только до конца вызова функции.Объявление его как static double d[] = {3};
сделает его действующим на всю жизнь программы, но оно будет иметь единственную инициализацию, и любые изменения будут сохраняться бесконечно.
Другое важное отличие состоит в том, что вы не можете изменитьадрес, так как это не действительно указатель;++d
не будет допустимым, поскольку d
является массивом, а не указателем.
Для точного эквивалента char *s = "Hi";
вы в основном застряли с двумя строками.Этот код примерно эквивалентен:
static char unnamed[] = {'H', 'i', '\0'};
char *s = unnamed;
Это специальное поведение строковых литералов Си, для которых ни один другой тип не имеет прямой языковой поддержки.Точное копирование с помощью double
всегда будет двухстрочным:
static double dstorage[] = {3};
double *d = dstorage;