BerthaDusStuf Ответов: 2

Я не понимаю, почему именно так работают связанные списки


В книге, которую я читаю, показано, что связанные списки создаются следующим образом:

EnemySpaceShip* getNewEnemy ()
{
  EnemySpaceShip* p_ship = new EnemySpaceShip;
  p_ship->x_coordinate = 0;
  p_ship->y_coordinate = 0;
  p_ship->weapon_power = 20;
  p_ship->p_next_enemy = p_enemies;
  p_enemies = p_ship;
  return p_ship;
}


Чего я не понимаю, так это того, что на линиях:

p_ship->p_next_enemy = p_enemies;
p_enemies = p_ship;

Здесь, Когда назначается следующий враг, не должен ли он принимать адресное значение следующего врага, чтобы оно выглядело следующим образом:

p_ship->p_next_enemy = &p_enemies;
p_enemies = p_ship;


Что я уже пробовал:

Ничего........................................................

2 Ответов

Рейтинг:
7

Richard Andrew x64

Посмотрите, как объявляется p_enemies, и он, вероятно, объявлен как указатель.

Вы бы не сказали &p_enemies, потому что p_enemies уже является указателем. Вам не нужно брать адрес указателя. На самом деле это приведет к сбою программы, потому что при попытке разыменования адреса указателя он будет указывать (скорее всего) на нераспределенную память.


BerthaDusStuf

привет извините, что я так долго отвечал, Из-за школы, но спасибо за ваш ответ, теперь я понимаю, почему он не должен указывать на адрес следующего врага, потому что это означало бы получить значения следующего врага, вам пришлось бы дважды разыменовать, чтобы получить значения врага, но я все еще думаю, что это сработало бы, если бы это было так, вы могли бы просто разыменовать дважды, чтобы получить значения врага, и я не понимаю, почему он будет указывать на нераспределенную память, так как при объявлении p_enemies ему был бы дан действительный адрес памяти.

Рейтинг:
19

Jon McKee

Краткое описание указателей в C++:

EnemySpaceShip* ship; //defining a pointer "ship"
ship; //the pointer (address of value)
*ship; //the value
&ship; //the address of the pointer, the value returned is EnemySpaceShip**
       //(pointer to a pointer)

Ваша функция заключается в том, чтобы вставить новый корабль в начало существующего списка кораблей, создав новый корабль (p_ship), связывая существующий список судов (p_enemies) на новый корабль, а затем установите указатель списка кораблей на новый корабль.

Так что да, он должен взять адрес списка вражеских кораблей, что он и делает. Использование & означало бы получение адреса из списка адресов вражеских кораблей.


BerthaDusStuf

Спасибо за ответ. Я не думаю, что он взял бы адрес списка, но он просто взял бы адрес этого корабля, потому что каждый корабль имеет свой собственный индивидуальный адрес, но теперь я вижу, как он будет работать, не беря адрес указателя.