Учитывая характер вопроса, я собираюсь дать несколько грубый ответ.
Указатель указывает на что-то:
int x = 123; // x is a memory location (lvalue)
int* y = &x; // y points to x
int** z = &y; // z points to y
В приведенном выше коде z указывает на y, который указывает на x, где хранится интеграл, 123.
x-> y-> z [123] (это не код, это
текстовая диаграмма)
Мы можем заставить y указывать на другое целое число, если мы хотим, чтобы NULL указывал на ничто, и мы можем заставить z указывать на другой указатель на целое число, если мы хотим, чтобы NULL указывал на ничто.
Так зачем нам указатели, которые указывают на другие вещи? Вот пример: допустим, у вас есть простой игровой движок, и вы хотите сохранить список игроков в игре. Возможно, в какой-то момент игры игрок может умереть, вызвав функцию убийства для этого игрока:
void kill(Player* p);
Мы хотим передать указатель игроку, потому что мы хотим убить оригинального игрока. Если бы мы сделали это вместо этого:
void kill(Player p);
Мы не убили бы оригинального игрока, но его копию. Это ничего не даст исходному плееру.
Указатели могут быть назначены / инициализированы значением NULL (NULL или 0), что означает, что указатель не будет указывать на что-либо (или перестанет указывать на что-либо, если он указывал на что-то раньше).
Позже вы узнаете о ссылках, которые похожи на указатели, за исключением того, что указатель может изменить то, на что он указывает, в течение своей жизни. Ссылка не может и устраняет необходимость явного разыменования указателя для доступа к объекту (на что он указывает).
Примечание. Я как бы обошел вокруг вашего первоначального вопроса, но приведенный вами пример кода не имеет никакого осмысленного поведения. Попытка понять этот пример без первого понимания указателей в общем смысле работает ИМХО в обратном направлении, и вам лучше сначала изучить эту общую теорию.