Это *pk = new int(2);
должно быть pk
вместо *pk
После того как вы объявили указатель int * pointer
, все ссылки на point
ссылаться на адрес и все ссылки на *pointer
относятся к тому, что содержащиеся по адресу. По умолчанию указатели не указывают на правильные ячейки памяти, вам необходимо назначить действительный адрес или позвонить по адресу new
. Вот почему, когда вы пишете pk = &k
, ошибок сегментации нет - потому что pk
теперь содержит адрес k
, который указывает на допустимую ячейку памяти.
Синтаксис указателей может быть немного запутанным, главным образом потому, что *
может иметь несколько значений, в зависимости от того, как вы его используете. Вот краткое объяснение:
- В декларациях,
*
означает, что вы объявляете указатель (т.е. int * pk
).
- Между численными типами данных
*
является символом для умножения (то есть 4 * num
).
- Написано рядом с переменной, оно возвращает значение по адресу, содержащему указатель (т.е.
*myPointer
или (*mypointer)
).
С new
возвращает адрес, вы назначаете адрес для pk
вместо значения, указываемого pk
.
Если вы хотите инициализировать указатель, объявите его оператором new
. Например:
int * pk = new int;
Но нет функции времени компиляции, которая объявляет автономный указатель и значение. Самое близкое, что вы придете к этому, - объявить отдельную переменную, как вы это сделали, и инициализировать указатель с адресом этой переменной. Как это:
int num = 43;
int * p = #
Любой хороший вводный C++ книга объяснить. Первый - это объявление указателя, второе - указатель. «*» Означает разные вещи в двух контекстах. –
Конечно, я это знаю. Может быть, вы не поняли мой вопрос или мой вопрос плохо построен. – Zingam
-1: неспособность сделать фундаментальные исследования. – milleniumbug