int *p1=10;
иВ чем разница между этими указателями?
int *p2;
p2=new int;
*p2=10;
В чем разница между этими двумя переменными? Разве не переменная, выделенная в куче?
int *p1=10;
иВ чем разница между этими указателями?
int *p2;
p2=new int;
*p2=10;
В чем разница между этими двумя переменными? Разве не переменная, выделенная в куче?
Разница заключается в том, что первый не компилируется:
lol.cpp:2:10: error: cannot initialize a variable of type 'int *' with an rvalue of type 'int'
int *p1 = 10;
^ ~~
1 error generated.
а второй делает Int в куче со значением 10, и выделяет указатель на это значение в стеке.
Если первый один сделал компиляцию, скажем, если вы добавили бросок, он бы присваивая значение 10 для указателяp1
, а это означает, что p1
будет указывать на адрес памяти 10 = 0x0A
и *p1
бы попробовать для разыменования этого адреса как int, что было бы segfault. (Если вы использовали другой номер, который попал в пространство памяти вашего процесса, это было бы какое-то произвольное целое на основе содержимого содержащейся в нем памяти.)
Выражение int* p1 = 10
не должно компилироваться: оно инициализирует указатель с целым числом!
Оба p1
и p2
являются указателями на целые переменные.
Инициализация p1
неверна. В качестве указателя он должен содержать адрес целочисленной переменной. И вы назначаете «адрес» значение «10»: вы устанавливаете его на адрес 0x0000000A
, что почти наверняка недействительно.
И в соответствии с другой частью вашего вопроса. Нет, они не оба распределены в куче. На самом деле они оба выделены в стеке. Только второй указывает на область, выделенную на кучу оператором new
. Они были бы распределены в куче, если бы они были частью объекта, привязанного к new
.
Это что, Clang? Я поздравляю вас с отличным выбором компилятора :) +1, так как это тоже правильно. – delnan