An I/O address is a numeric identifier that a computer's CPU uses to communicate with a peripheral. Every I/O port on a computer, like a USB port, Ethernet jack, and HDMI port, has a unique address that differentiates it from every other port. Separate I/O addresses help the CPU know which peripheral is which and interact with them directly.
When a program running on a computer's CPU needs to communicate directly with a peripheral, it sends commands and data to that peripheral's I/O address. The peripheral can respond by sending information back to the computer's CPU at that same address. For example, when you print a document, the CPU forwards the document and print settings to the printer's I/O address, where the printer can then process that request and print the document.
Early computers often mapped I/O ports using fixed addresses based on the type of I/O port — for example, the standard address for a computer's first serial port was always 0x03F8. These addresses were separate from system memory and required unique CPU instructions to send data to and from I/O devices. Modern computers now use a more efficient method called memory-mapped I/O that assigns addresses to I/O ports from the same address space as the main system memory. Sharing that address space allows any CPU instruction that accesses system memory to also access I/O devices. Since the operating system now manages I/O addresses, applications can use system APIs to interact with peripherals instead of sending data to specific, pre-defined addresses — drastically increasing reliability and reducing the frequency of conflicts.