private void createPointers(Program program, Address start, int count) {

		DataType pointerDt = new PointerDataType(program.getDataTypeManager());

		Listing listing = program.getListing();
		Memory mem = program.getMemory();
		DumbMemBufferImpl buf = new DumbMemBufferImpl(mem, start);

		for (int i = 0; i < count; ++i) {

			Address addr = start.add(pointerDt.getLength() * i);
			buf.setPosition(addr);

			Address refAddr = (Address) pointerDt.getValue(buf, null, -1);
			if (refAddr == null) {
				// terminate table early if unable to produce address - bytes correspond to illegal offset
				return;
			}
			if (refAddr.getOffset() == 0) {
				// skip over 0 offsets which may be a result of an unsupported relocation
				// or runtime initialized bytes
				continue;
			}

			Data d = listing.getDefinedDataAt(addr);
			if (d != null && d.isPointer()) {
				// skip locations where pointer already exists
				continue;
			}

			if (!mem.contains(refAddr)) {
				// terminate table early if pointer reference address does not exist
				// within memory (demangled address tables should only refer to entities
				// contained within program memory).
				return;
			}

			CreateDataCmd cmd = new CreateDataCmd(addr, false, false, pointerDt);
			if (!cmd.applyTo(program)) {
				Msg.debug(this, "Unable to demangled address table pointer at " + addr + ": " +
					cmd.getStatusMsg());
				return;
			}
		}
	}
Creates pointers from start address.
If a pointer already exists, then skip it and continue.
Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledAddressTable.java