Это правильный способ инициализации указателя?

0

Правильно ли это использовать функцию, которая записывает указатель? Должен ли я выделять память для double* перед вызовом функции?

double *myDouble;
write_to_pointer( myDouble );
  • 0
    Вам не обязательно «выделять» память. Вы должны убедиться, что указатель указывает на double объект, в который вы можете писать.
  • 0
    @juanchopanza Я полагаю, что не в моем примере?
Показать ещё 2 комментария
Теги:
pointers
memory

3 ответа

2
Лучший ответ

Вы можете указывать указатели на данные различными способами.

Ниже будет создан один двойной myDub, на который будет myDub. Затем он назначит значение myDub 4. Затем он удалит myDub и установит указатель на NULL.

double * myDub = new double;
*myDub = 4;
delete myDub;
myDub = NULL;

Аналогичным образом можно распределить массивы.

double * myDub = new double[123];
myDub[0] = 4;
myDub[3] = 43;
delete[] myDub;
myDub = NULL;

И вы можете указать указатели на уже существующие переменные. (Обратите внимание, что я не вызываю delete в этом случае!)

double onStack = 4;
double * myDub = &onStack;
4

Вы имеете в виду, что он записывает сам указатель или в память, на которую он указывает?

Если он первый, и он принимает указатель по ссылке, например:

void write_to_pointer(double *& p) {
    p = whatever;
}

то это правильно, хотя и довольно запутанно. Было бы лучше вернуть значение в качестве возвращаемого значения, чтобы назначение было более очевидным:

double *get_pointer() {return whatever;}
double *myDouble = get_pointer();

Если это второе, то нет: указатель не указывает ни на что, поэтому попытка разыменования даст неопределенное поведение (как правило, сбой или повреждение некоторой другой памяти программы). Он должен будет указывать на действительный double (или достаточно большой массив double, если это ожидает функция).

  • 0
    Извините, я имел в виду последнее. Должен ли я использовать new чтобы сделать это где-нибудь? Можно ли так делать? double myDouble[3] = {0,0,0} ? (если он ожидает место для трехэлементного двойного массива)
  • 0
    @ Анна Да, хорошо указывать на любой массив. Нет необходимости использовать new если вам не нужно динамическое распределение по другим причинам.
1

Это неправильный способ записи в указатель. Либо выделите память для вашей переменной:

double *myDouble =  new double;
write_to_pointer( &myDouble );
delete myDouble;

в этом случае декларация будет write_to_pointer (double **)

ИЛИ

объявите переменную в стеке:

double myDouble;
write_to_pointer( &myDouble );

в этом случае декларация будет write_to_pointer (double *)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню