У меня есть два указателя одного типа, указывающие на один и тот же адрес, но значения разные. что мне кажется довольно странным.
Редактировать: мне очень жаль, что я не заметил разницы между адресами, они отличаются второй цифрой справа.
#include <iostream>
int main()
{
int* array = new int[]{1,2,3,4,5};
int* p = array;
//delete[] array;
array = new int[]{6,7,8,9,10};
for(int i=0; i<5; i++)
{
std::cout << &(array[i]) << " => " << array[i] <<'\n';
std::cout << &(p[i]) << " => " << p[i] <<'\n';
std::cout << "--------------------\n";
}
}
при комментировании массива «delete[]» вывод будет следующим:
0x55763f7bc2d0 => 6
0x55763f7bc2b0 => 1
--------------------
0x55763f7bc2d4 => 7
0x55763f7bc2b4 => 2
--------------------
0x55763f7bc2d8 => 8
0x55763f7bc2b8 => 3
--------------------
0x55763f7bc2dc => 9
0x55763f7bc2bc => 4
--------------------
0x55763f7bc2e0 => 10
0x55763f7bc2c0 => 5
--------------------
если не комментировать, значения, конечно, равны.
После array = new int[]{6,7,8,9,10};
, array
и p
указывают на две разные вещи.
Если вы раскомментируете массив «//delete[];» строка, то p остается висячим указателем, и разыменование его является неопределенным поведением до тех пор, пока вы не присвоите ему новое допустимое значение, чего вы никогда не делаете. массив также будет висеть до следующей строки: "array = new int[]{6,7,8,9,10};" где вы даете ему новое, допустимое значение. (Возможно, что новое значение соответствует тому, где находился старый, теперь удаленный массив, но на это нельзя рассчитывать.)
@songyuanyao, так почему &array[i] и &p[i] равны? разве это не означает, что они указывают на один и тот же адрес?
@AviBerger, теперь это начинает иметь больше смысла :) спасибо
@FariAnderson Нет, они разные.
Итак, вы неправильно прочитали вывод. ИМХО, сам вопрос - опечатка.
@3CxEZiVlQ исправь это, и я отредактирую, если смогу. спасибо
Добро пожаловать в С++! Вообще ничего странного не происходит. Показанный результат — именно то, что можно было ожидать.
Когда создается новый массив, он возвращает указатель на первый элемент. Когда создается первый массив, переменная array
указывает на 1. Затем создается переменная p
и устанавливается равной array
, так что в этот момент обе переменные имеют одинаковое значение и обе указывают на 1.
Затем создается новый массив, и значение указателя присваивается переменной array
, которая затем указывает на 6. Переменная p
не изменилась и по-прежнему указывает на 1.
Глядя на адреса &(array[i])
и &(p[i])
, вы видите, что они, как и ожидалось, разные. Хотя «б» и «г» очень похожи, и мне пришлось минуту пристально смотреть на них, чтобы понять, что они разные.
черт возьми, я не увидел этой разницы. ржу не могу. спасибо большое чувак ты спас мою душу :))
Не знаю, почему за это проголосовали. В основном это полезно, за исключением того, что следует упомянуть, что после delete[] array
поведение p[i]
не определено.
Нет, нет. Вы изменили одно, чтобы указать на что-то другое. Итак, у вас есть два указателя на разные адреса, имеющие разные значения.