В обоих случаях вызывается неопределенное поведение, в обоих случаях вы используете неинициализированный указатель p1
, тот факт, что второй случай "работает" для вас, является вопросом чистой удачи, как вы можете видеть здесь .
Для того, чтобы ваш код был действительным, вам нужно указать ему действительный адрес памяти, выделив память вручную:
int *p1 = new int; //raw pointer, (better to use smart pointers* but let's not get ahead of ourselves).
или присвоив ему адрес действительного int
переменная:
int i = 5;
int *p1 = &i;
Как скопировать указатель и сохранить его в другом указателе?
Указатель по сути является переменной, как и любой другой, вы можете скопируйте его так, как будто вы делаете обычную примитивную переменную, фактически вы делаете именно это, когда вы делаете p = p1
, это два разных указателя, которые теперь будут содержать одно и то же значение, адрес переменной, на которую они указывают.
Этот код иллюстрирует это
#include <iostream>
using std::cout;
using std::endl;
int main() {
int *p1 = new int;
*p1 = 7;
int *p = p1;
cout<< "Value stored in the address p points to: " << *p << endl
<< "Value stored in the address p1 points to: " << *p1 << endl
<< "Address where p points to: " << p
<< " " << endl << "Address where p1 points to: "<< p1
<< endl << "Address of p: " << &p << endl << "Address of p1: "<< &p1;
return 0;
}
Вывод:
Value stored in the address p points to: 7
Value stored in the address p1 points to: 7
Address where p points to: 0x804150
Address where p1 points to: 0x804150
Address of p: 0x7ffc9447e220
Address of p1: 0x7ffc9447e228
* Что такое умный указатель и когда его следует использовать?