Ein Zeiger ist erstmal nur eine Variable, die eine Speicheradresse enthält. Wenn Du mit malloc() bzw. new() z.B. 1000 Bytes an Speicher anforderst, dann reserviert Windows Dir bzw. Deinem Programm 1000 Byte im Hauptspeicher. Die Details der Speicherverwaltung sind erstmal nicht wichtig.
malloc() und new() geben Dir dann die Adresse zurück, wo im Hauptspeicher Dein reservierter Speicher liegt. Diesen Speicher kannst Du dann beliebig verwenden. Üblicherweise verwendet man diesen Speicher, um Strukturen wie Listen, Arrays, usw. darin abzulegen. Um das Rad nicht jedesmal neu erfinden zu müssen, gibt's für C++ z.B. die STL (Standard Template Library).
Man kann mit Zeigern auch rechnen. Wenn Du allerdings versuchst, mit einem ungültigen Zeiger, also einem Zeiger, der auf eine Speicheradresse zeigt, die Du vorher nicht reserviert hast, dann stürzt Dein Programm ab, da Windows diesen Zugriff verhindert. Diese Art von Fehlern sind übrigens recht häufig anzutreffen.